我在尺度A
的Matlab中有一个向量(mxn)x1
,由大于或等于零的实数组成,例如m=3,n=4
A=[1;0;0;0;0.4;0.7;0.5;0.6;0.8;0;1;6]
看起来像
A=[1
0
0
---
0
0.4
0.7
---
0.5
0.6
0.8
---
0
1
6]
我们可以看到A
由维度n
的{{1}}子向量组成。我有一个维度为m
的向量B
,gx1
大于或等于g
,由1和0组成,使得1的总数等于{{ 1}},例如m
m
看起来像
g=9
我想创建一个维度B=[1;0;0;0;0;0;0;1;1]
的矩阵B=[1
0
0
0
0
0
0
1
1]
,其中C
的每个子向量的条目与每列gxn
中的条目相对应例如,A
g
只有在非常快的情况下才能正常循环。矩阵的实际维度非常大(例如B
)
答案 0 :(得分:2)
方法#1(bsxfun
基于线性索引)
C = zeros(g,n) %// Pre-allocate
idx = bsxfun(@plus,find(B),[0:n-1]*g) %// Indices where A elements are to be put
C(idx)= A %// Put A elements
方法#2(直接替换)
C = zeros(g,n)
C(find(B),:) = reshape(A,m,[])
预分配:对于faster pre-allocation
,您可以在上述两种方法中执行此操作 -
C(g,n) = 0;
答案 1 :(得分:1)
您还可以尝试repmat
和逻辑索引方法。首先,重新整形数据,使其处于正确的矩阵形式,因此在您的情况下3 x 4
,然后使用B
作为逻辑掩码,并将其复制多次,就像我们在矩阵中有列一样,然后做一个任务。在执行此分配之前,您必须分配一个与所需输出大小相同的矩阵。像这样:
%// Your example data
m = 3; n = 4;
A = [1;0;0;0;0.4;0.7;0.5;0.6;0.8;0;1;6];
B = logical([1 0 0 0 0 0 0 1 1]).';
%// Relevant code
Am = reshape(A, m, n);
Bm = repmat(B, 1, n);
C = zeros(numel(B), 4);
C(Bm) = Am;
C
是理想的结果,我们得到:
C =
1.0000 0 0.5000 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0.4000 0.6000 1.0000
0 0.7000 0.8000 6.0000
我的直觉是,这会比bsxfun
方法慢,但如果您不熟悉bsxfun
的工作方式,则上述内容更具可读性。