1

我有以下称为测试的结构数组,其中每个字段都是包含矩阵的 [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.

然后我尝试重塑临时变量,但它仍然不是正确的形式

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

有没有更简单的方法来做到这一点而无需循环或不必分离内容?谢谢。

4

2 回答 2

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
于 2012-06-27T21:41:46.330 回答
0

您可能需要考虑您的应用程序需要哪些数据类型。您当前正在使用数值数组、元胞数组和结构(即双重嵌套结构!)。

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

你可以这样做:

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

如果您想要一个数据结构同时保存levellevelsq,您可以将两者连接成一个三维矩阵:

test = cat(3, level, levelsq);

你可以通过调用来访问level,通过调用来访问test(:,:,1)levelsq test(:,:,2)

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

于 2012-06-27T21:48:49.297 回答