我正在使用 MATLAB。我有一个关于如何验证矩阵的值是否重复的问题,如下所示:
A=[ 2 3 2 3 2 3 2 3]
如果矩阵 A 至少重复所有列的前两个值,我想要 AUX = 1。但如果不是,只有 AUX = 0。
如果是行向量或列向量,则以下单行有效A
,但如果它是矩阵则不一定有效(感谢@Dan 在注释中提供了简化)。我认为这没关系,因为您在问题中提供的示例是向量。
AUX = ~any(A(3:end) - A(1:end-2))
这个矢量化解决方案应该比@Nirk 提供的非矢量化解决方案快很多(对于 large A
)。
根据您的应用程序,您可能需要包含错误陷阱:
if size(A, 2) < 3; error('Input matrix needs to have at least 3 columns'); end
请注意,有关处理该案例的一些替代方法,请参阅对此答案的评论size(A, 2) < 3
。
这是另一种简单的方法:
AUX = all(A(1) == A(1:2:end)) && all(A(2) == A(2:2:end))
基本上这会检查所有奇数元素是否等于第一个元素,以及所有偶数元素是否等于第二个元素。
我想提出另一种方法。正如我在您要求“重复”时看到的那样,也许您希望重复相同的“模式”。为此,很容易滥用字符串函数。
A=[1,2,3,4,1,2,3,4,1,2,3]
position_repetition = strfind(A,A(1:2))
我想你可以使用regexp
更复杂的模式。像这样将检查重复的最长模式:
tmp = regexp(char(A),'(?<group>.+)\1+','names')
group = double(tmp.group)
这应该是我理解的问题 - 它检查它是否是前两个条目的重复:
A=[1,2,3,4,1,2,3,4,1,2,3,4]
tmp = regexp(char(A),'^(?<group>..)\1+$','names')
AUX = ~isempty(tmp)