如何在matlab中从结果矩阵中检查每个变量的值?

时间:2017-01-30 19:42:41

标签: matlab

我有3个单元格数组的总和

A=72x1
B=72x720
C=72x90
resultant=A+B+C
size of resultant=72x64800

现在当我找到行索引和列索引的最小值时,我可以轻松找到行元素但是如何在变量中找到列元素? 例如 在对A,B,C进行计算之后,我将它们全部加入并得到来自< 72x(720x90)>的结果。或者可以说大小为< 72x64800>的整数矩阵。然后我使用下面的代码找到了行和列索引的最小值。

[minimumValue,ind]=min(resultant(:));
  [row,col]=find(result== minimumValue);

然后行得到14,列得到6840值 .. 现在我可以轻松地跟踪所有A,B,C变量的第14行,但是我怎么知道结果列6480属于A,B,C的哪个组合?

1 个答案:

答案 0 :(得分:2)

不使用find,而是使用min函数中的ind output。这是minimumValue的{​​{3}}。为此,您可以使用linear index

[r,c] = ind2sub(size(resultant),ind);

resultant = A+B+C你的意思并不十分清楚,因为如果你得到一个更大的数组(72x64800),你显然不能总结它们,另一方面,这不是一个简单的连接( [A B C])因为这会产生72x811数组。

但是,假设此连接,您可以执行以下操作:

% get the 2nd dimension size of all matrices:
cols = cellfun(@(x) size(x,2),{A,B,C}) 
% create a vector with reapiting matrices names for all their columns:
mats = repelem(['A' 'B' 'C'],cols);
% get the relevant matrix for the c column:
mats(c)

所以mats(c)将是具有最小值的矩阵。

修改

从您的评论中我了解到您的代码看起来像这样:

% arbitrary data:
A = rand(72,1);
B = rand(72,720);
C = rand(72,90);
% initializing:
K = size(B,2);
N = size(C,2);
counter = 1;
resultant = zeros(72,K*N);
% summing:
for k = 1:K
    for n = 1:N
        resultant(:,counter) = A + B(:,k) + C(:,n);
        counter = counter+1;
    end
end
% finding the minimum value:
[minimumValue,ind] = min(resultant(:))

从答案开始你知道你可以这样做:

[r,c] = ind2sub(size(resultant),ind)

获取minimumValueresultant的行和列。所以,你可以这样做:

[Ccol,Bcol] = ind2sub([N,K],c)

其中BcolCcol分别是BC中的列,因此:

minimumValue == A(r) + B(r,Bcol) + C(r,Ccol)

要了解它的工作方式,可以想象上面的循环使用counter的值填充矩阵 M ,并且M的大小为N - 由 - K。因为我们使用线性索引填充 M ,所以它将以列主要方式填充,因此该行将对应于n迭代器,并且该列将对应于{{ 1}}迭代器。现在k对应于我们获得最小值的c M counter的行和列告诉我们{{1}中的列}和counter,因此我们可以再次使用B来获取C位置的下标。当然,我们并不需要创建 M ,因为其中的值只是线性索引本身。