在Matlab中计算不同大小矩阵的元素

时间:2014-06-17 19:56:48

标签: matlab matrix equation

有人能帮我找出计算 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中的示例。 enter image description here

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 =

enter image description here

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中写这个?

谢谢!

2 个答案:

答案 0 :(得分:4)

你可以这样做。我们假设AB的定义与之前相同:

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}}中的特定行进行减法。在我们的例子中,xx1。这等于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,你的意思是在垂直连接AB之后的列数最大值,你可以试试这个单行 -

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)

由于AB的值,此案例的输出与前一种情况保持一致。