我有一个长度增长的矩阵,例如4×x矩阵A,其中x在循环中增加。我想找到最小的列c,其中之前的所有列都带有一个单独的数字。矩阵A可以看起来像:
A = [1 2 3 4;
1 2 3 5;
1 2 3 1;
1 2 3 0];
其中c=3
和x=4
。
在A
长度增加的循环的每次迭代中,索引c
的值也会增长。因此,在每次迭代时,我想更新c
的值。我在Matlab中如何有效地编写代码?
答案 0 :(得分:0)
你可以用这个:
c = find(arrayfun(@(ind)all(A(1, ind)==A(:, ind)), 1:x), 1, 'first');
这会找到并非所有值都相同的第一列。如果在循环中运行它,则可以检测列中的条目何时开始不同:
for x = 1:maxX
% grow A
c = find(arrayfun(@(ind)~all(A(1, ind)==A(:, ind)), 1:x), 1, 'first');
% If c is empty, all columns have values equal to first row.
% Otherwise, we have to subtract 1 to get the number of columns with equal values
if isempty(c)
c = x;
else
c = c - 1;
end
end
答案 1 :(得分:0)
我们假设您有矩阵A
,并且您想检查特定列ii
以查看其所有元素是否相同。代码是:
all(A(:, ii)==A(1, ii)) % checks if all elements in column are same as first element
另外,请记住,一旦条件被破坏,x就不能再更新了。因此,您的代码应为:
x = 0;
while true
%% expand A by one column
if ~all(A(:, x)==A(1, x)) % true if all elements in column are not the same as first element
break;
end
x = x+1;
end
答案 2 :(得分:0)
让我试一试:
% Find the columns which's elements are same and sum the logical array up
c = sum(A(1,:) == power(prod(A,1), 1/size(A,1)))
d=size(A,2)
答案 3 :(得分:0)
要查找最后一列,使得每列直接包含相同的值:
c = find(any(diff(A,1,1),1),1)-1;
或
c = find(any(bsxfun(@ne, A, A(1,:)),1),1)-1;
例如:
>> A = [1 2 3 4 5 6;
1 2 3 5 5 7;
1 2 3 1 5 0;
1 2 3 0 5 8];
>> c = find(any(diff(A,1,1),1),1)-1
c =
3
答案 4 :(得分:-1)
你可以尝试这个(简单快捷):
Equal_test = A(1,:)==A(2,:)& A(2,:)==A(3,:)&A(3,:)==A(4,:);
c=find(Equal_test==false,1,'first')-1;
如果需要,您还可以查看查找结果。