如何在MATLAB中对向量和矩阵进行分量相乘?

如何在MATLAB中对向量和矩阵进行分量相乘?,matlab,vector,vectorization,Matlab,Vector,Vectorization,我想计算以下表达式: a_2 = c_k2 * (b - t_k2) 其中t_k2是大小为K1 x k2的列向量,b是大小为K1 x 1的列向量,c_k2是常数(1 x 1)。但我有这些t向量的K2。我知道我可以做到: t % (K1 x K2) b % (K1 x 1) a_k2 % (K1 x K2) c % (K2 x 1) for k2=1:K2 t_k2 = t(:,k2); % K1 x 1 c_k2 = c(k2); a_k2(:,k2) = c_k2 *

我想计算以下表达式:

a_2 = c_k2 * (b - t_k2)
其中
t_k2
是大小为
K1 x k2
的列向量,b是大小为
K1 x 1
的列向量,
c_k2
是常数(
1 x 1
)。但我有这些t向量的K2。我知道我可以做到:

t % (K1 x K2)
b % (K1 x 1)
a_k2 % (K1 x K2)
c % (K2 x 1)
for k2=1:K2
    t_k2 = t(:,k2); % K1 x 1
    c_k2 = c(k2);
    a_k2(:,k2) = c_k2 * (b - t_k2); % K1 x 1
end
但我想知道是否有一种解理器方法可以在MATLAB中将其写成一行(以避免所有的索引和循环,并希望加快速度)。可能吗

我最初的想法是将b复制到大小为“K1 x K2”的矩阵中。假设可以这样做,用B表示。然后我们可以计算B-t,我们有
(B-t_k2)
的每个条目。假设我们能做到这一点,我唯一的想法就是将每个常数c_k复制到一个向量中,如
c_k_vec=[c_k,…c_k]
中所示,然后对这些矩阵进行元素乘法。很明显,B应该:

B = repmat(b, [1,K2]);

完成部分任务…但我不清楚如何在一行中生成列为
c_k_vec=[c_k,…c_k]
而不循环的矩阵。其思想是向量c与每列B-t匹配,我们想用向量x中的条目乘以每列B-t


也许这是不可能的…

我不确定c_k_vec从哪里来,但是向量乘法可以很容易地通过对每个元素进行。*所以如果你已经解决了(b-t_k2)部分,用这个函数乘以常数应该很简单。*

你几乎回答了你的问题(再次:))。您当然可以使用
b
上的
repmat
水平复制列向量
K2
次,以使维度一致。但是,
c
矩阵有一个小问题,因为如果要实现矢量化输出矩阵的计算,维度当前不兼容

如果我正确理解了您的问题,那么输出的每一行都应该乘以相应的
c
行。在这种情况下,它只是在
c
上运行
repmat
的另一种情况,但是将这个向量
K1
复制几次

具体来说,您可以这样做:

a_k2 = repmat(c.', K1, 1) .* (repmat(b, 1, K2) - t);
注意,我必须转置
c
,因为你说它是一个
k2x1
向量。为了确保大小匹配,我将其转换为
1 x K2
,并且
repmat
“ing将复制此矩阵,使其成为
K1 x K2
,以与中间结果匹配

然而,这看起来有点不雅。我鼓励您充分利用这一点,在幕后进行复制:

a_k2 = bsxfun(@times, c.', bsxfun(@minus, b, t));
首先要做的是将
b
复制到与
t
一样多的列中,然后我们将通过复制
c
向量,在形状上与中间结果匹配,将此中间结果乘以右侧的
c
值。
bsxfun
的妙处在于,你不需要知道你需要重复多少次
bsxfun
为您找到答案


为了证明这三条语句都是等价的,让我们生成一些示例数据,并运行
for
循环,然后运行我上面编写的两段代码:

%// Data setup
rng(123);
K1 = 10;
K2 = 12;

t = rand(K1, K2);
b = rand(K1, 1);
c = rand(K2, 1);

%// Your code
for k2=1:K2
    t_k2 = t(:,k2); % K1 x 1
    c_k2 = c(k2); %// Note - typo here
    a_k2(:,k2) = c_k2 * (b - t_k2); % K1 x 1
end

%// Using repmat
a_k2r = repmat(c.', K1, 1) .* (repmat(b, 1, K2) - t);

%// Using bsxfun
a_k2b = bsxfun(@times, c.', bsxfun(@minus, b, t));
a_2k
是由您的代码生成的,而
a_k2r
a_k2b
是我建议的两段代码的输出。如果我们将它们全部显示,我们将得到:

>> a_k2

a_k2 =

  Columns 1 through 7

    0.1527    0.0905    0.1628    0.7042    0.2768    0.0623    0.1011
   -0.0574   -0.0840   -0.3855   -0.1957    0.0905   -0.0491   -0.1620
    0.0480   -0.0235   -0.2595   -0.1198   -0.0244   -0.0246   -0.1424
   -0.0229    0.0741   -0.0547    0.0228    0.1035   -0.0020   -0.0663
    0.1334    0.0812    0.1078    0.4122    0.0350    0.0444    0.0255
    0.4098    0.0396    0.3969    0.5813    0.7211    0.0539    0.3857
   -0.5287    0.0121   -0.0626   -0.1462   -0.2218   -0.0127   -0.2168
   -0.0881    0.0626    0.2019   -0.2849   -0.4143   -0.0093    0.1374
    0.2384    0.0444    0.3083   -0.1188    0.2827   -0.0054    0.2625
    0.0016   -0.0221   -0.1421   -0.0931   -0.2149   -0.0092   -0.0763

  Columns 8 through 12

    0.1656    0.2643    0.1098    0.0366    0.1747
   -0.1386   -0.2183   -0.4315   -0.0428   -0.0435
   -0.0685   -0.1180   -0.0347    0.0174    0.0360
   -0.0416    0.0591   -0.1329    0.0363   -0.0918
    0.1812   -0.0105    0.1691    0.0541    0.1672
    0.0796    0.0640    0.1599    0.0301    0.1280
   -0.0612   -0.0450    0.0583   -0.0550   -0.0953
    0.0829    0.2347    0.0906    0.0010    0.0127
    0.1338    0.2263    0.3101   -0.0044    0.2388
   -0.0616   -0.0017    0.0279    0.0009   -0.1763

>> a_k2b

a_k2b =

  Columns 1 through 7

    0.1527    0.0905    0.1628    0.7042    0.2768    0.0623    0.1011
   -0.0574   -0.0840   -0.3855   -0.1957    0.0905   -0.0491   -0.1620
    0.0480   -0.0235   -0.2595   -0.1198   -0.0244   -0.0246   -0.1424
   -0.0229    0.0741   -0.0547    0.0228    0.1035   -0.0020   -0.0663
    0.1334    0.0812    0.1078    0.4122    0.0350    0.0444    0.0255
    0.4098    0.0396    0.3969    0.5813    0.7211    0.0539    0.3857
   -0.5287    0.0121   -0.0626   -0.1462   -0.2218   -0.0127   -0.2168
   -0.0881    0.0626    0.2019   -0.2849   -0.4143   -0.0093    0.1374
    0.2384    0.0444    0.3083   -0.1188    0.2827   -0.0054    0.2625
    0.0016   -0.0221   -0.1421   -0.0931   -0.2149   -0.0092   -0.0763

  Columns 8 through 12

    0.1656    0.2643    0.1098    0.0366    0.1747
   -0.1386   -0.2183   -0.4315   -0.0428   -0.0435
   -0.0685   -0.1180   -0.0347    0.0174    0.0360
   -0.0416    0.0591   -0.1329    0.0363   -0.0918
    0.1812   -0.0105    0.1691    0.0541    0.1672
    0.0796    0.0640    0.1599    0.0301    0.1280
   -0.0612   -0.0450    0.0583   -0.0550   -0.0953
    0.0829    0.2347    0.0906    0.0010    0.0127
    0.1338    0.2263    0.3101   -0.0044    0.2388
   -0.0616   -0.0017    0.0279    0.0009   -0.1763

>> a_k2r

a_k2r =

  Columns 1 through 7

    0.1527    0.0905    0.1628    0.7042    0.2768    0.0623    0.1011
   -0.0574   -0.0840   -0.3855   -0.1957    0.0905   -0.0491   -0.1620
    0.0480   -0.0235   -0.2595   -0.1198   -0.0244   -0.0246   -0.1424
   -0.0229    0.0741   -0.0547    0.0228    0.1035   -0.0020   -0.0663
    0.1334    0.0812    0.1078    0.4122    0.0350    0.0444    0.0255
    0.4098    0.0396    0.3969    0.5813    0.7211    0.0539    0.3857
   -0.5287    0.0121   -0.0626   -0.1462   -0.2218   -0.0127   -0.2168
   -0.0881    0.0626    0.2019   -0.2849   -0.4143   -0.0093    0.1374
    0.2384    0.0444    0.3083   -0.1188    0.2827   -0.0054    0.2625
    0.0016   -0.0221   -0.1421   -0.0931   -0.2149   -0.0092   -0.0763

  Columns 8 through 12

    0.1656    0.2643    0.1098    0.0366    0.1747
   -0.1386   -0.2183   -0.4315   -0.0428   -0.0435
   -0.0685   -0.1180   -0.0347    0.0174    0.0360
   -0.0416    0.0591   -0.1329    0.0363   -0.0918
    0.1812   -0.0105    0.1691    0.0541    0.1672
    0.0796    0.0640    0.1599    0.0301    0.1280
   -0.0612   -0.0450    0.0583   -0.0550   -0.0953
    0.0829    0.2347    0.0906    0.0010    0.0127
    0.1338    0.2263    0.3101   -0.0044    0.2388
   -0.0616   -0.0017    0.0279    0.0009   -0.1763
。。。另外,让我们比较原始矩阵(您的代码)和其中每一个矩阵之间的绝对差异,找出最大偏差:

>> format long g
>> max_diff1 = max(abs(a_k2(:) - a_k2r(:)))

max_diff1 =

     0

>> max_diff2 = max(abs(a_k2(:) - a_k2b(:)))

max_diff2 =

     0

如你所见,如果我们用我用
repmat
bsxfun
生成的结果计算
a_2k
之间的元素相减,它表示两个矩阵之间的最大差异是0。。。。因此,我们可以看到源代码和两种可选方法之间没有区别。

no不是,因为它不是元素级乘法。其思想是,向量c与每列B-t匹配,我们希望将每列B-t乘以向量x中的条目。输出是
K1 x K2
大小矩阵,而
c_k
向量是
K2 x 1
矩阵。在调用
*
之前,需要另外调用
repmat
调用
c_k
bsxfun
是你的朋友吗?我不是唯一一个使用
one(N,1)*
*one(1,N)
而不是
repmat
的老朋友,是吗?@user3528438-我以前也这样做过。。。在我学习repmat之前。。。然后我就坚持使用
repmat
。。。但是通过
one(1,N)
one(N,1)
复制索引肯定是有效的!
>> format long g
>> max_diff1 = max(abs(a_k2(:) - a_k2r(:)))

max_diff1 =

     0

>> max_diff2 = max(abs(a_k2(:) - a_k2b(:)))

max_diff2 =

     0