Arrays MATLAB中多阵列的逐单元比较
我有多个输入数组,我想生成一个输出数组,其中如果列中的所有元素都相同,则值为0;如果列中的所有元素都不同,则值为1 例如,如果有三个阵列:Arrays MATLAB中多阵列的逐单元比较,arrays,matlab,Arrays,Matlab,我有多个输入数组,我想生成一个输出数组,其中如果列中的所有元素都相同,则值为0;如果列中的所有元素都不同,则值为1 例如,如果有三个阵列: A = [28, 28, 43, 43] B = [28, 43, 43, 28] C = [28, 28, 43, 43] Output = [0, 1, 0, 1] 数组可以是任意大小和任意数量,但数组的大小也是相同的。不花哨,但可以做到这一点 Output=nan(length(A),1); %preallocation and check i
A = [28, 28, 43, 43]
B = [28, 43, 43, 28]
C = [28, 28, 43, 43]
Output = [0, 1, 0, 1]
数组可以是任意大小和任意数量,但数组的大小也是相同的。不花哨,但可以做到这一点
Output=nan(length(A),1); %preallocation and check if an index isn't reached
for i=1:length(A)
Output(i)= ~isequal(A(i),B(i),C(i));
end
如果有人有一个没有循环的答案,那就接受这个答案,但我觉得性能在这里不是问题。一个无循环的方法是使用
diff
和any
来获得优势:
A = [28, 28, 43,43];
B = [28, 43, 43,28];
C = [28, 28, 43,43];
D = any(diff([A;B;C])) %Combine all three (or all N) vectors into a matrix. Using the Diff to find the difference between each element from row to row. If any of them is non-zero, then return 1, else return 0.
D = 0 1 0 1
有几种简单的方法可以做到这一点 让我们从将相关向量放入矩阵开始:
M = [A; B; C];
现在我们可以做如下事情:
idx = min(M)==max(M);
或
似乎没有人指出数组的数量是可变的。在你的例子中,你有三个,但你说你可以有一个变量。我还想尝试一下使用广播 您可以创建一个函数,该函数将采用可变数量的数组,并且输出将为您提供一个在所有数组中共享相同数量列的数组,这些数组符合您所说的输出 首先创建一个较大的矩阵,将所有数组连接在一起,然后使用来利用广播第一行并确保找到所有相等的列。您可以使用来完成此步骤:
function out = array_compare(varargin)
matrix = vertcat(varargin{:});
out = ~all(bsxfun(@eq, matrix(1,:), matrix), 1);
end
这将获取堆叠矩阵的第一行,并查看该行是否与堆叠矩阵中每列的所有行相同,并返回相应的向量,其中0表示每列都相等,否则为1
将此函数保存在MATLAB中并调用它array\u compare.m
,然后您可以在MATLAB中调用它,如下所示:
A = [28, 28, 43, 43];
B = [28, 43, 43, 28];
C = [28, 28, 43, 43];
Output = array_compare(A, B, C);
我们在MATLAB中得到:
>> Output
Output =
0 1 0 1
这些是字符串还是数字?它们都可以是字符串、数字或两者的组合……那么这些就是单元格数组,对吗?这些不是数字数组或字符串。所以,如果你有
A={'28',45}代码>和B={28,'46'}代码>,输出是否为[0,1]
?你需要用更多信息更新你的帖子。当涉及到细节时,您的问题还有很多需要改进的地方。对于单元格字符串(“字符串数组”)使用strcmp,对于数字数组使用strcmp=
,对于and和OR使用&
将多个测试连成一列。谢谢大家。。。如果我将转换为代码中的等效数字。。。所以,现在只考虑数值,并建议同样的逻辑…我注意到你接受了我的答案,然后不接受它。有什么原因吗?
>> Output
Output =
0 1 0 1