有没有办法将struct(:)。a(:,1)矢量化为数组(:,:)?

时间:2016-10-18 20:53:52

标签: matlab vectorization

如果可能的话,我有以下代码,我感兴趣的是从for循环转换为向量操作。前提是给定结构数组data,每个元素都有一个包含单个列向量的字段a。所有字段a上的所有列向量都是相同的长度。我想从所有字段中获取每个列向量,并将数据转换为矩阵,其中每列包含来自此数组中字段a的一个列向量。这意味着第一列应为data(1).a,第二列应为data(2).a,依此类推。

    % All arrays in 'data.a' are column vectors of equal length
    % (leaving 'numCols' in incase some genius can also make that general)
    [numRows,numCols] = size(data(1).a);

    % Pre-allocate for speed
    array1 = NaN(numRows,numCols);

    % Convert from struct to array
    for ii = 1:length(data)
        array1(:,ii) = data(ii).a;
    end

1 个答案:

答案 0 :(得分:7)

烨。只是做:

array1 = [data.a];

这很好,因为你甚至不需要知道列向量的大小或者为了构建预分配矩阵而产生的总列数(总列数实际上等于只是结构数组中的元素总数(btw)。实际上,由于我们正在直接构建矩阵,因此不再需要预分配。您可以同时创建适当的空间并在一个步骤中使用内容填充矩阵。这是因为我们利用data(ii).a包含单个列的事实,并且结构数组中a字段的所有列包含存储在字段{{1}中的列向量中的相同行数}}

执行a输出所谓的comma-separated list。这意味着执行data.a等同于在MATLAB命令提示符中键入以下内容:

data.a

如果您将>> data(1).a, data(2).a, data(3).a, ..., data(N).a 放在一组方括号中,那么您基本上就是构建一次只能找到一列的矩阵。

可重现的例子

data.a

>> rng(123); clear data; >> data(1) = struct('a', rand(5, 1)); >> data(2) = struct('a', rand(5, 1)); >> data(3) = struct('a', rand(5, 1)); 包含一个三元素结构数组,其字段data包含随机a列向量。

以下是每个向量的样子:

5 x 1

使用我给你的单行代码给出:

>> for ii = 1 : numel(data), disp(data(ii).a); end

0.6965
0.2861
0.2269
0.5513
0.7195

0.4231
0.9808
0.6848
0.4809
0.3921

0.3432
0.7290
0.4386
0.0597
0.3980