我有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的哪个组合?
答案 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)
获取minimumValue
中resultant
的行和列。所以,你可以这样做:
[Ccol,Bcol] = ind2sub([N,K],c)
其中Bcol
和Ccol
分别是B
和C
中的列,因此:
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 ,因为其中的值只是线性索引本身。