在matlab中构造二维数组

时间:2014-03-21 05:44:15

标签: matlab loops matrix

让我们考虑以下等式

x(t)=sum(a(i)*sin(2*pi*f(i)*t+b(i)*cos(2*pi*f(i)*t))

其中i = 1,2,...... m和频率f=[f1,f2,.....fm]t=[t1,t2,....tn]

我希望按sin(2*pi*f(i)*t)cos(2*pi*f(i)*t)创建矩阵,显然它是带维度NX2*m的矩阵,我尝试过以下代码

function [amplitudes]=determine_amplitudes(y,f,t,n,m);

X=zeros(n,2*m);
for i=1:n
     for k=1:m
      if mod(k,2)==1 
          X(i,k)=sin(2*pi*f(k)*t(i));
      else
           X(i,k)=cos(2*pi*f(k)*t(i);
      end

     end
end
end

我使用mod运算符来确定如果k是奇数索引,则应该写入sin值,否则为余弦值,但问题是我不确定给定矩阵是否具有维度NX2 * m,那么如何创建这样的矩阵,使其不超过频率数组的边界索引,回想一下频率数组跟随f=[f1,f2,..fm],所以我的问题很简单,就是如何在2 * m位置应用m频率,谢谢你的帮助

更新:

假设m = 3,频率f=[12.5 13.6 21.7]

然后我们有跟随矩阵,也假设

 n=4 t=[0.01 0.02 0.03 0.04]

 sin(2*pi*f(1)*t(1))  cos(2*pi*f(1)* t(1)) sin(2*pi*f(2)*t(1)) cos(2*pi*f(2)*t(1)) sin(2*pi*f(3)*t(1)) cos(2*pi*f(3)*t(1))

1 个答案:

答案 0 :(得分:1)

无循环版

[f1,t1] = meshgrid(f',t');

p1 = sin(bsxfun(@times,f1,2*pi*t')); %%// Create sin copy '
p2 = cos(bsxfun(@times,f1,2*pi*t')); %%// Create cos copy '

d1 = [p1;p2];
final_matrix = reshape(d1,size(p1,1),[]);

天真循环版

final_matrx2 = zeros(n,2*m);
for k1=1:n
    for k2=1:2*m
        if rem(k2,2)==1 
            final_matrx2(k1,k2) = sin(2*pi*f(ceil(k2/2))*t(k1));
        else
            final_matrx2(k1,k2) = cos(2*pi*f(ceil(k2/2))*t(k1));
        end
    end
end