假设我想犯1到100(以度为单位)的罪。
我来自C背景,所以我的直觉是在for循环中循环1到100(我可以在Matlab中做)。在矩阵/向量/数组中,我将存储sin(x),其中x是for循环的计数器。
我无法弄清楚如何在Matlab中做到这一点。我是否创建了一个像
这样的数组x = [1 .. 100];
然后再做
x[offset] = numberHere;
我知道“正确”的方式。对于像添加这样的操作,你使用。+而不是+和一个像sin这样的函数我很确定你只是做
resultArray = sin(x);
我只是想知道我可以以C方式进行,以防万一,所以我的问题在这里。 :)
答案 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编译功能,使其比以前更具戏剧性,但仍然如此:如果可以>>始终进行矢量化。