结构数组 - 在没有循环的字段内对矩阵进行操作

时间:2012-06-27 21:11:28

标签: arrays matlab struct

我有以下称为test的结构数组,其中每个字段都是包含矩阵的[1x3]结构数组。我想创建一个新的字段levelsq,它逐个元素逐个元素。我可以用循环来做到这一点:

[test(1:3).level] = deal([1,1],[2,2],[3,3])

for i = 1:3
   test(i).levelsq = test(i).level.^2
end

test.level
ans =
     1     1
ans =
     2     2
ans =
     3     3

test.levelsq
ans =
     1     1
ans =
     4     4
ans =
     9     9

我通过分离和连接元素得到了一些方法,但还没有能够添加新字段:

temp = num2cell([test.level].^2) 
test.levelsq = temp{:}
??? Illegal right hand side in assignment. Too many elements.

然后我尝试重塑temp变量,但它仍然没有以正确的形式

temp2= reshape(temp,2,3)'
temp2 = 
[1]    [1]
[4]    [4]
[9]    [9]

是否有更简单的方法可以在不循环或不必分离内容的情况下执行此操作?感谢。

2 个答案:

答案 0 :(得分:1)

test = arrayfun(@(x) setfield(x, 'levelsq', x.level .^ 2), test);

顺便说一句,如果设置列向量,则可以轻松访问数组的值:

>> [test.level]

ans =

     1     2     3
     1     2     3

>> [test.levelsq]

ans =

     1     4     9
     1     4     9

答案 1 :(得分:0)

您可能想要考虑应用程序所需的数据类型。您当前正在使用数字数组,单元数组和结构(在那里使用双重嵌套结构!)。

“Matlab”方法是使用数字数组(即矩阵)完成所有这些操作。它们经过高度优化,非常有利于数学运算。

你可以这样做:

level = [ 1 1; 2 2; 3 3;];
levelsq = level.^2;

如果您希望单个数据结构同时包含levellevelsq,则可以将两者连接成三维矩阵:

test = cat(3, level, levelsq);

您可以通过拨打test(:,:,1)来访问级别,并通过调用test(:,:,2)来访问级别。

另一方面,如果您需要保留正在使用的数据结构,则无法击败@Serg。