有人能帮我找出计算 Matlab 中不同大小矩阵元素的方法吗?
假设我有两个带数字的矩阵。 例如:
A=[1 2 3;
4 5 6;
7 8 9]
B=[10 20 30;
40 50 60]
首先,我们需要在每列中找到最大数量。 在这种情况下,Ans = [40 50 60]。
然后,我们需要找到****系数**(k)。 系数(k)等于1除以矩阵A的列数。 在这种情况下,**系数(k) = 1/3 = 0.33。
我想通过计算创建矩阵 C 。
MS Excel中的示例。
H4 = ABS((C2-C6)/ C9)* 0.33 + ABS((D2-D6)/ D9)* 0.33 + ABS((E2-E6)/ E9)* 0.33
I4 = ABS((C3-C6)/ C9)* 0.33 + ABS((D3-D6)/ D9)* 0.33 + ABS((E3-E6)/ E9)* 0.33
J4 = ABS((C4-C6)/ C9)* 0.33 + ABS((D4-D6)/ D9)* 0.33 + ABS((E4-E6)/ E9)* 0.33
然后(如上所述)
H5 = ABS((C2-C7)/ C9)* 0.33 + ABS((D2-D7)/ D9)* 0.33 + ABS((E2-E7)/ E9)* 0.33
I5 = ABS((C3-C7)/ C9)* 0.33 + ABS((D3-D7)/ D9)* 0.33 + ABS((E3-E7)/ E9)* 0.33
J5 = ABS((C4-C7)/ C9)* 0.33 + ABS((D4-D7)/ D9)* 0.33 + ABS((E4-E7)/ E9)* 0.33
C =
0.34 = |(1-10)| /40*0.33+ |(2-20)| /50*0.33+ |(3-30)| /60*0.33
0.28 = |(4-10)| /40*0.33+ |(5-20)| /50*0.33+ |(6-30)| /60*0.33
0.22 = |(7-10)| /40*0.33+ |(8-20)| /50*0.33+ |(9-30)| /60*0.33
0.95 = |(1-40)| /40*0.33+ |(2-50)| /50*0.33+ |(3-60)| /60*0.33
0.89 = |(4-40)| /40*0.33+ |(5-50)| /50*0.33+ |(6-60)| /60*0.33
0.83 = |(7-40)| /40*0.33+ |(8-50)| /50*0.33+ |(9-60)| /60*0.33
实际上A是15x4矩阵,B是5x4矩阵。 也许,矩阵维数不仅仅是这个矩阵(变量)。 我怎样才能在Matlab中写这个?
谢谢!
答案 0 :(得分:4)
你可以这样做。我们假设A
和B
的定义与之前相同:
A = vec2mat(1:9, 3)
B = vec2mat(10:10:60, 3)
A =
1 2 3
4 5 6
7 8 9
B =
10 20 30
40 50 60
vec2mat
会将矢量转换为矩阵。您只需指定所需的列数,它就会自动确定将向量转换为正确形状矩阵的正确行数(感谢@LuisMendo!)。我们还根据您的帖子定义更多内容:
maxCol = max(B); %// Finds maximum of each column in B
coefK = 1 / size(A,2); %// 1 divided by number of columns in A
我将假设coefK
乘以 A
中的每个元素。因此,您将计算所需的矩阵:
cellMat = arrayfun(@(x) sum(coefK*(bsxfun(@rdivide, ...
abs(bsxfun(@minus, A, B(x,:))), maxCol)), 2), 1:size(B,1), ...
'UniformOutput', false);
outputMatrix = cell2mat(cellMat).'
你得到:
outputMatrix =
0.3450 0.2833 0.2217
0.9617 0.9000 0.8383
看起来有点像咀嚼吧?让我们慢慢来看看。
bsxfun(@minus, A, B(x,:))
电话开始吧。我们正在做的是采用A
矩阵并使用名为B
的{{1}}中的特定行进行减法。在我们的例子中,x
是x
或1
。这等于2
中的行数。关于B
的酷炫之处在于,bsxfun
调用此行会在A
中减去每一行。B(x,:)
。因此,我们将调用另一个maxCol
,它将第一步中输出的矩阵中的每个元素除以bsxfun
中相应的列元素。maxCol
(或实际矩阵中的每个值)。在我们的例子中,这是coefK
。1/3
的输出矩阵的每一列提供相应的元素。x
开始到1, 2, 3, ...
中的行数,我们应用{{1}这将取代B
的值从1,2,3 ......到arrayfun
中的行数。对于x
的每个值,我们会得到一个B
向量,其中x
是A和B共享的列总数。此代码只有{strong>才能使用{{1 }和numCol x 1
共享相同数量的列。我没有在此处进行任何错误检查。在这种情况下,我们在两个矩阵之间共享3列。我们需要使用numCol
并将其设置为A
,因为B
的输出不是单个数字,而是矢量。UniformOutput
将这些单元格数组元素转换为单个矩阵。这篇文章专门介绍Luis Mendo和Divakar - false
大师。
答案 1 :(得分:2)
假设maximum number in each column
,你的意思是在垂直连接A
和B
之后的列数最大值,你可以试试这个单行 -
sum(abs(bsxfun(@rdivide,bsxfun(@minus,permute(A,[3 1 2]),permute(B,[1 3 2])),permute(max(vertcat(A,B)),[1 3 2]))),3)./size(A,2)
输出 -
ans =
0.3450 0.2833 0.2217
0.9617 0.9000 0.8383
如果按maximum number in each column
,您的意思是B
的列数最大值,则可以尝试 -
sum(abs(bsxfun(@rdivide,bsxfun(@minus,permute(A,[3 1 2]),permute(B,[1 3 2])),permute(max(B),[1 3 2]))),3)./size(A,2)
由于A
和B
的值,此案例的输出与前一种情况保持一致。