我需要以下简单矩阵操作的帮助。
我的输入是:
A =
9.8627 14.6475
65.7510 97.6500
-48.9131 -72.6431
65.7510 97.6500
B =
60.3806 39.3176 39.3176 22.1663 16.1483
0 0 0 0 0
123.8806 80.6665 80.6665 45.4778 33.1309
0 0 0 0 0
C =
279.2250 275.4000 183.6000 202.7250 84.1500
0 0 0 0 0
518.7707 511.6642 341.1095 376.6417 156.3418
0 0 0 0 0
然后是我的matlab代码:
x_3 = size(A);
x_4 = size(B);
for m_1 = 1:x_3(1,2);
for n_1 = 1:x_4(1,2);
G = A(:,m_1)+ B(:,n_1)+C(:,n_1)
end
end
此代码的结果:
G =
349.4682
65.7510
593.7382
65.7510
G =
324.5802
65.7510
543.4176
65.7510
G =
232.7803
65.7510
372.8629
65.7510
G =
234.7540
65.7510
373.2064
65.7510
G =
110.1610
65.7510
140.5597
65.7510
G =
354.2531
97.6500
570.0081
97.6500
G =
329.3651
97.6500
519.6875
97.6500
G =
237.5651
97.6500
349.1328
97.6500
G =
239.5388
97.6500
349.4763
97.6500
G =
114.9458
97.6500
116.8296
97.6500
但是我想要的输出只是一个矩阵G,它具有上面显示的所有十个矩阵(作为列)。所以基本上它会是这样的:
G =
349.4682 324.5802 BLAH...
65.7510 65.7510 BLAH...
593.7382 543.3176 BLAH...
65.7510 65.7510 BLAH...
请有人帮忙.... :(
我很感激,谢谢!
答案 0 :(得分:1)
你在循环的每次迭代中都覆盖了G的值:
G = A(:,m_1)+ B(:,n_1)+C(:,n_1)
您需要将新计算的行附加到G:
的现有行G = [G, A(:,m_1)+ B(:,n_1)+C(:,n_1)]
答案 1 :(得分:1)
以下内容应该有效(但仅适用于size(B,2)=5
和size(A,2) = 2
):
G = [repmat(A(:,1),1,5) repmat(A(:,2),1,5)]+ repmat(B+C,1,2);
输出
G =
Columns 1 through 9
349.4683 324.5803 232.7803 234.7540 110.1610 354.2531 329.3651 237.5651 239.5388
65.7510 65.7510 65.7510 65.7510 65.7510 97.6500 97.6500 97.6500 97.6500
593.7382 543.4176 372.8629 373.2064 140.5596 570.0082 519.6876 349.1329 349.4764
65.7510 65.7510 65.7510 65.7510 65.7510 97.6500 97.6500 97.6500 97.6500
Column 10
114.9458
97.6500
116.8296
97.6500
如果列的顺序不那么重要,可以使用简短的一般解决方案:
nA = size(A,2);
nB = size(B,2);
G = repmat(A,1,nB) + repmat(B+C,1,nA);
然后列的顺序交替出现(先是A(:,1)然后是A(:,2)...):
G =
Columns 1 through 9
349.4683 329.3651 232.7803 239.5388 110.1610 354.2531 324.5803 237.5651 234.7540
65.7510 97.6500 65.7510 97.6500 65.7510 97.6500 65.7510 97.6500 65.7510
593.7382 519.6876 372.8629 349.4764 140.5596 570.0082 543.4176 349.1329 373.2064
65.7510 97.6500 65.7510 97.6500 65.7510 97.6500 65.7510 97.6500 65.7510
Column 10
114.9458
97.6500
116.8296
97.6500
鉴于答案各不相同,我把它们带到了速度测试中,在我的pokey笔记本电脑上进行了10000次迭代:
@LuisMendo经过的时间是1.906000秒。
@TryHard经过的时间是1.625000秒。 (编辑!)
@MohsenNosratinia经历的时间是3.985000秒。
答案 2 :(得分:1)
以下代码可以满足您的需求。由于您没有指定大小,我已经非常一般:A和B可以有任意数量的列。假设B和C具有相同的大小,当然A,B,C需要具有相同的行数。
D = B+C;
numA = size(A,2);
numB = size(B,2);
sol = reshape(repmat(A,numB,1),size(A,1),size(A,2)*numB) + repmat(D,1,numA)
答案 3 :(得分:1)
您可以要求kron
函数为您完成所有重复
G = kron(A, ones(1,size(B,2)))+kron(ones(1,size(A,2)),B+C);
答案 4 :(得分:1)
保持与原始代码的接近(这不是非常有效,但这不是您所询问的):您只需要确保每个循环都会将您带到G中的新列:
gcol = 0;
for m_1 = 1:x_3(1,2);
for n_1 = 1:x_4(1,2);
gcol = gcol + 1;
G(:, gcol) = A(:,m_1) + B(:,n_1) + C(:,n_1)
end
end
这会将每个连续的结果放在自己的列中。
最好在开始之前分配G
的大小 - 这是一个好习惯,随着矩阵大小的增加变得更加重要(它可以防止大量数据复制和#34;新尺寸的空间")。为此,您将使用
G = zeros(x_3(1), x_3(1,2) * x_4(1,2));
在嵌套循环之前。
注意 - 此配方的优点是您可以非常清楚地看到代码正在做什么。根据我的经验,10次中有9次"清晰的代码"特朗普"高效但难以遵循"码。从现在开始的六个月,您想要记住您的代码所做的事情。在速度真的很重要的情况下,我会经常放慢速但清晰的#34;注释中的代码,并执行快速但模糊的" - 使用测试用例确保他们确实产生相同的答案。看起来很麻烦,但值得花费额外的时间。有一天你会感谢我......
编辑另一种有点优雅的技巧会使用bsxfun
- 如下所示:
G = reshape( bsxfun(@add, reshape(A, size(A,1),1,[]), B+C), size(A,1), []);
这是有效的,因为bsxfun
将在每个维度上自动执行操作(add
),其中一个数组具有单个维度,而另一个数组具有非单个维度 - 实际上执行{for
1}}循环而不需要for循环。因为没有更大的"制作数组的副本,它应该稍微快一些。当A和B,C是大数组时,这可能更明显 - 因为当前大小的大部分时间都会进入函数开销。
我没有运行时间基准测试,但通常bsxfun
比repmat
更快...例如参见https://stackoverflow.com/a/12955706/1967396