我试图在matlab中解决以下简单问题:
我试图通过使用for循环来做到这一点。但是,我还没弄明白。
这是我到目前为止所提出的:
n = [0:1:10];
b = 2*n;
c = 0.5*n;
B=0;
for ii = 1:length(b)
for jj = 1:length(c)
B(ii) = B+sum(b(jj)*c(ii-jj))
end
end
当ii = jj并且我有c(0)时,似乎我遇到了问题,并且不能使用该索引。 我该如何解决这个问题?
答案 0 :(得分:7)
你只是在进行卷积:
B = conv(b,c);
B = B(1:numel(b)); %// remove unwanted values
答案 1 :(得分:2)
Matlab对来自1
的数组进行索引,因此元素c(0)
不存在。解决此问题的最简单方法是将1
添加到表达式中,这可能是
B(ii) = B+sum(b(jj)*c(ii-jj+1))
但请检查这不会在向量的另一端给出一个1分之一的错误。
一般来说,由于Matlab从1开始索引,因此在从源代码转换算法时需要考虑到这一点,例如从0开始的数学表达式。这是编写软件时必须进行的一种调整
编辑:正如@Dan所评论的那样,您还应该将jj
上的循环修改为for jj = 1:ii
。
答案 2 :(得分:1)
所以你需要把逻辑假设为(ii == jj)B(ii)= B + sum(b(jj)* c(ii-jj + 1))其他B(ii)= B +和(b(jj)* c(ii-jj))这是一个伪代码,所以你可以转换这个逻辑。
答案 3 :(得分:1)
N = 1:10;
b = 2*N;
c = 0.5*N;
B=zeros(length(N),1); %//This preallocation of B makes your code much faster
for n = N
for k = 1:n %//Note the change here
B(n) = B(n) + b(k)*c(n-k+1); %// Added the +1 to the index of c like High Performance Mark suggests but also note you don't need the sum() since b(k)*c(n-k+1) is only a single number anyways
end
end
甚至可以更好地对内循环进行矢量化:
for n = N
B2(n) = b(1:n)*c(n:-1:1)';
end