Matlab 将元素从一个数组添加到另一个数组中,每次添加一个

Matlab 将元素从一个数组添加到另一个数组中,每次添加一个,matlab,Matlab,如果我有一个数组 A = [2 4 6 8] 和另一个数组 B = [1 2 3 4 5 6 7] 然后我想取A的第一个元素,即2,将其添加到B的每个元素中,并将结果数组保存到矩阵C 接下来,我想获取4,将其添加到B的每个元素中,然后再次将其保存到C 同样,对于6和8元素,重复相同的过程 如何在不使用循环的情况下获得矩阵C C = [(3 4 5 6 7 8 9)' (5 6 7 8 9 10 11)' (7 8 9 10 11 12 13)' (9 10 11 12 13 14 15)

如果我有一个数组

A = [2 4 6 8]
和另一个数组

B = [1 2 3 4 5 6 7]
然后我想取
A
的第一个元素,即
2
,将其添加到
B
的每个元素中,并将结果数组保存到矩阵
C

接下来,我想获取
4
,将其添加到
B
的每个元素中,然后再次将其保存到
C

同样,对于
6
8
元素,重复相同的过程

如何在不使用循环的情况下获得矩阵
C

C = [(3 4 5 6 7 8 9)' (5 6 7 8 9 10 11)'  (7 8 9 10 11 12 13)'  (9 10 11 12 13 14 15)']
只需使用:


另一种可能是平铺并立即进行。为此,根据参数大小、内存限制或就地覆盖自由度等,您有许多选项

复制阵列的一种方法是提供外部(也称为并矢或1秩等)乘积

因此,当您执行以下乘法时:

[1]
[1]    
[1] * [a b c ... ]
[1]
[1]
结果是具有相同行的秩1矩阵

[a b c ... ]
[a b c ... ]
[a b c ... ]
[a b c ... ]
[a b c ... ]
使用matlab函数
repmat
也可以做同样的事情,该函数以更一般的方式重复数组,并在内部依赖于
bsxfun
。在这里,一个简单的版本就足够了

# repmat(A,number of repetitions vertically,number of repetitions horizontally)
repmat([a b c ...]',1,n)
对于
n=4

[a a a a]
[b b b b]
[c c c c]
    .
    .
    .
您还可以使用
kron
,它是通过
meshgrid
实现的Kronecker产品,因此本质上是2D(简而言之,第二个参数是每个块乘以第一个参数的元素)

这与第一个参数的结果相同。现在您可以看到,根据参数的大小或创建的临时数组的数量,您可以混合使用这些方法,尽管它们执行相同的操作。例如内部不同的两个等效命令是

C = ones(length(B),1)*A + repmat(B',1,length(A));


因此,根据A和B的大小,如果您需要如此高的性能,您可能会从这些替代方案中受益。因此,一半的操作可以用一种方式完成,另一部分可以用另一种方式完成。与其说科学,不如说它是一门艺术。但是,在这些尺寸下,它们的差异非常微小。

您的预期输出是什么?谢谢。如果我想按任意顺序而不是按显示的顺序选择
A
的元素,那么
bxsfun
可以允许吗?或者我应该先按我想要的顺序订购?例如,可以使用
bxsfun
来按此顺序选择4,2,8,6->而不是2,4,6,8…吗?@nashynash reorder
A
当然可以。为什么
bsxfun
能够做到这一点?。但是在MATLAB中要做的事情很简单:
bsxfun(@plus,A([2,1,4,3]),B)
对于实数来说,你并不需要
就足够了:)@Dan OK。伯恩哈德说,这些数字永远都是真实的
是转置,这就是我们在这里所做的。尽管它给出了相同的结果,但从技术上讲,我们并不是在寻找复杂的共轭。为什么要混合这些方法呢?你可以直接去
C=one(长度(B),1)*A+B.。*one(1,长度(A))
我非常怀疑
repmat
会比矩阵乘法更好。@Dan只是为了展示可能性。在这些尺寸下,它们的速度差别不大。我认为这令人困惑。如果你想展示可能性,那就把这两种方法分别写出来。但混合使用它们只意味着任何阅读代码的人都必须弄清楚每个术语各自在做什么,然后可能会大惊小怪,试图弄清楚为什么
*
对第一个术语有好处,而
repmat
对第二个术语更好…@但它们代表相同的操作。没有含糊不清的地方。我不认为任何人会为了一篇专栏文章的重复而大惊小怪,特别是如果你孤立地评价那个部分的话。这是一行代码,而不是火箭科学想象一下遇到这个代码:
a=B+C+plus(D,E)
。当然,这相当于
A=B+C+D+E
,但是如果你遇到这个问题,你会停下来问为什么开发人员选择以不同的方式执行最后一次添加,因为如果没有理由,那么为什么会有人这样做?在操作的中间,切换样式是令人困惑的,如果我遇到这样的代码,我当然会尝试找出为什么这样做,因为我认为没有人会故意编写代码来迷惑人。尤其是不熟悉这两种方法的人。
kron([1;1;1;1;1],[a b c d e])
C = ones(length(B),1)*A + repmat(B',1,length(A));
C = kron(ones(length(B),1),A) + kron(ones(1,length(A)),B')