我有以下内容:
b = [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double]
其尺寸可变。
b{1}
ans =
0 0 0 0
我想将10个向量中每个向量的第一个条目作为矩阵A
的第一列
矩阵A
的第二列将作为r
的10个向量中的每一个的第一个条目:
r =
[1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double]
r {1} - > ans = 10 10 10 10
这是我需要得到的:
A =
v{1}(1) r{1}(1)
v{2}(1) r{2}(1)
v{3}(1) r{3}(1)
如果没有循环,如何做到这一点?
答案 0 :(得分:1)
一些示例数据:
b = {[ 101:104 ], [ 201:204 ], [ 301:304 ], [ 401:404 ], [ 501:504 ], [ 601:604 ], [ 701:704 ], [ 801:804 ], [ 901:904 ], [ 1001:1004 ]};
r = {[ 2101:2104 ], [ 2201:2204 ], [ 2301:2304 ], [ 2401:2404 ], [ 2501:2504 ], [ 2601:2604 ], [ 2701:2704 ], [ 2801:2804 ], [ 2901:2904 ], [ 3001:3004 ]};
编辑:使用vertcat
无需循环的更快的解决方案。
编辑:更正了代码中的拼写错误。
bMatrix = vertcat(b{:});
rMatrix = vertcat(r{:});
A = [ bMatrix(:,1), rMatrix(:,1) ];
使用cellfun
(cellfun
循环)的速度慢得多的解决方案:
A = [ cellfun(@(x) x(1), b)', cellfun(@(x) x(1), r)' ];
或部分:
ColumnOneOfMatrixA = cellfun(@(x) x(1), b)';
ColumnTwoOfMatrixA = cellfun(@(x) x(1), r)';
A = [ ColumnOneOfMatrixA, ColumnTwoOfMatrixA ];
两种方式都会产生相同的结果。
A =
101 2101
201 2201
301 2301
401 2401
501 2501
601 2601
701 2701
801 2801
901 2901
1001 3001
答案 1 :(得分:0)
正如Dan所说,cellfun
是避免这种循环的伎俩。
%Setup test data
for ix = 1:10
b{ix} = ones(1,4)*(ix-1);
r{ix} = ones(1,4)*(ix+9);
end
%Cellfun based definition of the "A" matrix
A = [...
cellfun( @(x)x(1), b(1:10) ); ...
cellfun( @(x)x(1), r(1:10) ); ...
]';
此处cellfun
调用已设置为返回一个数字数组,包含单元格数组中每个数字数组的第一个元素。匿名函数@(x)x(1)
作为核心,只返回第一个元素,cellfun
负责实现适当的循环,而不会打扰您的细节。
请注意,cellfun
通常不会比它替换的循环快。它只需要较少的打字,并且在您学习使用它之后可以更容易阅读。