You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab工作区存储矩阵列及迭代乘法循环实现问题

解决向量迭代相乘并存储为矩阵的问题

先来说你最初的核心需求:基于向量 v=[2;5;8],依次用前一次计算的结果乘以2、3、4,最终把每一步的结果存成一个3×3矩阵。你的原代码确实踩了两个坑:

  • 每次循环都用原始向量v去乘当前的i,根本没保留上一次的计算结果,所以第二次迭代得到的是v*3而不是(v*2)*3
  • 没有把每次的计算结果存储下来,只是每次覆盖变量k,最后只能看到最后一次的结果

实现需求的正确代码

咱们可以先初始化一个空矩阵用来存结果,然后在循环里迭代更新向量,同时把每一步的结果塞进矩阵的对应列里:

v = [2; 5; 8];
x = 2:4;
% 初始化结果矩阵,行数和v一致,列数和x的长度匹配
result_mat = zeros(length(v), length(x));
% 初始化临时向量,一开始等于原始v
current_v = v;

for idx = 1:length(x)
    current_v = current_v * x(idx); % 用前一次的结果乘当前的x值,实现迭代
    result_mat(:, idx) = current_v; % 把当前结果存入矩阵的第idx列
end

运行这段代码后,result_mat就是你想要的3×3矩阵:第一列是v*2,第二列是(v*2)*3,第三列是((v*2)*3)*4,完全符合你的预期。


你提供的两段FFT相关代码的问题

再看你贴的那两段涉及FFT的代码,这里也帮你揪出问题:

编辑后的代码1的问题

for i=1:1:length(x)
    c1=fftshift(fft(u0z));
    c2=exp(-1j*(p^2*x(i)/(2*lamda))).*c1;
    c3=ifft(ifftshift(c2));
    u1=exp(1j*lamda*(n(i)^2-1)*x(i)/2).*c3;
    u0z=u1
end
  • 没有存储每次计算的u1,每次循环都会覆盖u0z,最后只能拿到最后一次的计算结果
  • 循环步长1:1:length(x)完全可以简化成1:length(x),效果一模一样,没必要多写个1:

编辑后的代码2的问题

for k=1:1:length(x)
    c1=fftshift(fft(u0z));
    c2=exp(-1j*(p^2*x(k)/(2*lamda))).*c1;
    c3=ifft(ifftshift(c2));
    u1=exp(1j*lamda*(n(k)^2-1)*x(i)/2).*c3; % 这里用了i,但循环变量是k!
    u0z=u1;
    mat(:,k)=u0z;
end
  • 最致命的错误:u1的计算里用了x(i),但循环变量明明是k,这要么会引用未定义的i(如果之前没定义的话),要么会用错索引值,必须改成x(k)
  • 同样,1:1:length(x)可以简化为1:length(x)

如果你的需求是把FFT相关的计算结果也存储成矩阵,修正后的代码应该是这样:

% 前提是u0z、p、lamda、n这些变量都已经提前定义好
mat = zeros(length(u0z), length(x)); % 初始化结果矩阵
for k = 1:length(x)
    c1 = fftshift(fft(u0z));
    c2 = exp(-1j*(p^2*x(k)/(2*lamda))).*c1;
    c3 = ifft(ifftshift(c2));
    u1 = exp(1j*lamda*(n(k)^2-1)*x(k)/2).*c3; % 把x(i)改成x(k)
    u0z = u1;
    mat(:, k) = u0z;
end

内容的提问来源于stack exchange,提问作者Scavenger23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 12:52:36