Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays MATLAB中多阵列的逐单元比较_Arrays_Matlab - Fatal编程技术网

Arrays MATLAB中多阵列的逐单元比较

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

我有多个输入数组,我想生成一个输出数组,其中如果列中的所有元素都相同,则值为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 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