我有一个尺寸为 15NxM 的矩阵 A。也就是说,它由 N 个不同的 15xM 矩阵组成,这些矩阵相互堆叠。
我还有一个尺寸为 1x15 的向量 B。
我真正想做的是对 A 中的 N 个块中的每一个执行简单的矩阵乘法 B*A(Block),这样我就得到了一个 NxM 矩阵。
我需要这样做而不做任何循环,因为我这样做的主要原因是为了获得一些速度。
谢谢。
我有一个尺寸为 15NxM 的矩阵 A。也就是说,它由 N 个不同的 15xM 矩阵组成,这些矩阵相互堆叠。
我还有一个尺寸为 1x15 的向量 B。
我真正想做的是对 A 中的 N 个块中的每一个执行简单的矩阵乘法 B*A(Block),这样我就得到了一个 NxM 矩阵。
我需要这样做而不做任何循环,因为我这样做的主要原因是为了获得一些速度。
谢谢。
你可以试试
result = reshape( B * reshape(A, 15, []), N, M);
这避免了创建 B 的中间“repmat”副本;但reshape
可能很慢。
您可以将A
矩阵转换为元胞数组。首先,您将要创建一个矩阵维度 (15) 的 N 元素数组,用于指定单元格的大小:
dimArray = repmat(15, 1, N); % 1xN array of the number 15
接下来,您将调用mat2cell
您的矩阵A
将其转换为一个元胞数组,其中每个元胞都是 A 的 15xM 子矩阵:
newA = mat2cell(A, dimArray);
最后,调用cellfun
元胞数组进行乘法运算:
result = cellfun(@(x) B*x, newA, 'UniformOutput', false);
这应该为您提供一个单元格数组result
,其中包含矩阵B*A(block)
中每个块的结果。A
您可能可以将所有内容放在一行中,或者最多两行:
result = cellfun(@(x) B*x, mat2cell(A, repmat(15, 1, N)), 'UniformOutput', false);
虽然不是最清晰的代码。这似乎是一种有点迂回的做法。如果有人让它与之合作repmat
或类似,那么这可能是更好的方法。