【问题标题】:MATLAB : 3 dimensional matrix with multipication with a vectorMATLAB:与向量相乘的 3 维矩阵
【发布时间】:2016-01-22 05:07:26
【问题描述】:

我有A 矩阵,即16x16x155460。我有一个B 向量,它是12955x1。我想将每个1:16x1:16x1+12*n:12+12*nB(n) 的元素相乘。所以我的目标是根据B找到A的加权和。我这样做的方法如下(I don't want to use for-loop 和我的方法给出了错误的答案,我无法获得连续的 1:12 向量):

B = repmat(B,[1 16 16]);
B = permute(B,[2 3 1]);
B = repmat(B,[1 1 12]);
result = B.*(A);

作为一个小例子n=2

A(:,:,1)=[1 2; 3 4]
A(:,:,2)=[1 2; 3 4]
A(:,:,3)=[1 2; 3 4]
A(:,:,4)=[1 2; 3 4]
B      = [2,3]

结果是:

result(:,:,1)=A(:,:,1)*B(1);
result(:,:,2)=A(:,:,2)*B(1);
result(:,:,3)=A(:,:,1)*B(2);
result(:,:,4)=A(:,:,2)*B(2);

【问题讨论】:

  • 输出数组大小是多少?
  • 我先将矩阵重塑为16x16x12x12955...
  • 我理解你的意思吗,你只使用A(16,16,:) 而不是 A 中的其他数据?你的公式1+12*n:12+12*n错了,不是0开头,超过了A的长度
  • 那个例子让我很困惑:(
  • 过度简化示例的陷阱真的是@beaker

标签: matlab matrix vectorization


【解决方案1】:

如果我理解正确的话,你可以使用bsxfunpermutereshape这三个强大的三重奏来解决它,就像这样-

[M,N,R] = size(A);
mult_out = bsxfun(@times,reshape(A,M,N,numel(B),[]),permute(B(:),[4 3 1 2]))
out = reshape(mult_out,M,N,[])

【讨论】:

  • 你为什么要对 B 使用 permute,它是一个向量?
  • @toygankılıç permute on B 只是将其所有元素“转移”到第三维,这是您想要使用 A 进行扩展元素乘法的结果。阅读更多关于 permute 是如何工作的,在这里 - mathworks.com/help/matlab/ref/permute.html
  • 非常感谢您提供的高效解决方案!我知道这是个愚蠢的问题,但有时矩阵维度可能是个问题。 [4 3 1 2] 和 [3 4 1 2] 有区别吗?
  • @toygankılıç 不,两者都是一样的。只要保持1在第三个位置,其他三个位置的维度ID都无所谓。
  • 你觉得哪个维度对乘法很重要?
猜你喜欢
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多