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
相关产品推荐
相关产品推荐

