在矩阵中存储操作的结果

时间:2009-12-05 00:18:36

标签: matlab function vector

假设我想犯1到100(以度为单位)的罪。

我来自C背景,所以我的直觉是在for循环中循环1到100(我可以在Matlab中做)。在矩阵/向量/数组中,我将存储sin(x),其中x是for循环的计数器。

我无法弄清楚如何在Matlab中做到这一点。我是否创建了一个像

这样的数组
x = [1 .. 100];

然后再做

x[offset] = numberHere;

我知道“正确”的方式。对于像添加这样的操作,你使用。+而不是+和一个像sin这样的函数我很确定你只是做

resultArray = sin(x);

我只是想知道我可以以C方式进行,以防万一,所以我的问题在这里。 :)

5 个答案:

答案 0 :(得分:6)

% vectorized
x = sin((1:100)*pi/180);

% nonvectorized
x=[];
for i = 1:100
   x(i) = sin(i*pi/180);
end

答案 1 :(得分:2)

我相信这实际上可以作为MatLab中的一个班轮来完成:

x = sind(1:100);

请注意,您使用sand()而不是sin()。 Sin()将弧度作为参数。

答案 2 :(得分:1)

嗯,如果理解正确,你想要一个像结构一样的循环

resultArray = zeros(1,length(x)) %% initialization aint necessary I just forgot how you dynamically add members :x
for i = 1:length(x) %% starts with 1 instead of zero
   resultArray(i) = sin(x(i))
end

警告我没有对此进行测试,但它应该是正确的。

答案 3 :(得分:1)

@Daniel Fath

我认为你需要最后一行来阅读

resultArray(i) = sin(x(i))(而不是x(1))

我认为你也可以这样做:

for i = x    
   ...

虽然如果x不是简单的1-100向量,那么行为会有所不同

答案 4 :(得分:1)

正如其他人已经指出的那样,MATLAB中也存在for循环。

help for

应该为您提供有关其工作原理的所有信息。与C的不同之处在于循环可以遍历对象而不仅仅是整数:

objects = struct('Name', {'obj1', 'obj2'}, 'Field1', {'Value1','Value2'});
for x = objects
   disp(sprintf('Object %s Field1 = %d', x.Name, x.Field1))
end

该示例将输出:

Object obj1 Field1 = Value1
Object obj2 field1 = Value2

这可以作为

完成
for i=1:length(objects)
   x = objects(i);
   disp(sprintf('Object %s Field1 = %d', x.Name, x.Field1))
end

现在我想说的是:如果您曾在MATLAB中编写for循环,请停下来思考!。对于大多数任务,您可以对代码进行矢量化,以便它使用矩阵运算和内置函数,而不是循环数据。这通常会带来巨大的速度增益。矢量化代码的执行速度比循环代码快100倍并不罕见。 MATLAB的最新版本具有JIT编译功能,使其比以前更具戏剧性,但仍然如此:如果可以>始终进行矢量化。