有时候遇到使用索引会遇到超出矩阵维度的问题,你知道该怎么解决吗?小编这里整理了一些解决方法,快来一起看看吧。
索引中出现超出矩阵维度问题大部分都是由于超界导致的,下面我们就用几个例子来看看如何解决吧。
例1:
% ** ** ** gradOptimizMethod.m ** ** ** % clc clear x = [0: 0]; % 设置搜索起始点 eps = 0.01; % 精度 g = detaf(x); % 设定目标函数并计算起始点对应的函数梯度 nc = 0; % 迭代次数 syms alpha; while norm(g) > eps s = -g '/norm(g);%设置该点负梯度方向为搜索方向 tt = subs(x) + alpha * subs(s); ff = fx(tt(1), tt(2)); ff = inline(ff); [minx, maxx] = forwardBackward(ff, 1, 0, 1); t = quadraticInterpolation(ff, minx, maxx); % 一维搜索最优步长因子 xx + t * s; g = detaf(x); f = fx(x(1), x(2)); gradeValue = norm(g); nc = nc + 1; fprintf('**********第%d次搜索结果为********** *', 'nc'); x g gradeValue s t f end % ** ** ** deta.m ** ** ** % % 求解目标函数的梯度 function [gradf] = detaf(x) % detaf: ▽f % 目标函数: f; % 函数梯度: df; % 设计变量: x; gradf(1) = 2 * x(1) - 2 * x(2) - 5; gradf(1) = 6 * x(2) - 2 * x(1) - 7; end % ** ** ** fx.m ** ** ** % % 设定目标函数 function f = fx(x1, x2) f = x1 ^ 2 + 25 * x2 ^ 2; f = x1 * (x1 - 2 * x2 - 5) + x2 * (3 * x2 - 7); % 目标函数表达式 end 索引超出矩阵维度。 出错 detaf(line 8) gradf(1) = 2 * x(1) - 2 * x(2) - 5; 出错 gradOptimizMethod(line 6) g = detaf(x); % 设定目标函数并计算起始点对应的函数梯度
如以上例子就可能是数据文件有问题,我们把第41行的空格去掉,一直去到第40行的尾部,即光标符处于40行的尾部,保存,就可以了。
例2:
N = 2048 * 4; % 每周波采2048个点 fp = 30; % 拟显示的倍频次数, 需小于N / 2 用于使前面的参数显示清晰 wq = 5; % 稳定周期个数, 为保证下行程序数组不出错, workspce的数据周期必须大于wq值 kh = 0.01; % 幅值比例系数, 输出到文本时太小的谐波参数不输出 fid = fopen('output.txt', 'wt'); % 准备写入文件, 文件在当前目录下 fprintf(fid, '每周波采样点数=%d ', N); y = ScopeData.signals.values; % 读取workspce数据, 第一个点前面为示波器输出到workspce参数名 t = 0: 0.02 / N: 0.02 / N * (size(y) - 1); % 每个周期为0 .02 秒, 每周期采N个点, 共size(y) - 1 个点 subplot(2, 1, 1); plot(t, y); xlabel('时间/s'); ylabel('幅值'); title('原始信号'); grid on; subplot(2, 1, 2); pn = wq * N; % 取数据的基准点, 主要目的是等系统稳定 plot(t(pn: pn + N - 1), y(pn: pn + N - 1)); % 数据周期必须小于wq, 将出错 xlabel('时间/s'); ylabel('幅值'); title('抽取信号'); grid on; figure(2); subplot(2, 1, 1); z = fft(y(pn: pn + N - 1), N); mag = abs(z) / N * 2; % /N*2还原为真实的幅值 mag(1) = mag(1) / 2; % 直流幅值要再除以2 f = 0: N / 2; % 可分析N / 2 倍频率, N = 128 点时, 可解析64倍频相关参数 bar(f(1: fp), mag(1: fp)); % 频谱 直方图bar r(f(2: fp), mag(2: fp)); % 除去直流分量显示 r(f(3: fp), mag(3: fp)); % 除去基波分量显示 grid on; xlabel('频率/倍'); ylabel('幅值'); title('FFT分析结果'); fprintf(fid, '直流分量=%8.4g ', mag(1)); fprintf(fid, '基波峰值=%8.4g ', mag(2));
上例%基波频率为50Hz,大概率是因为scope波形设置的问题出错,我们只要一步步排查就可以了。
矩阵维数
如果我们还想要改变矩阵维数的话,就可以用reshape函数,用size函数可以求copy矩阵维数,用reshape可以改变数百据维数。 如: >> a=[1 2 3;4 5 6;7 8 9]; >> size(a) ans = 3 3 说明矩阵a是3行3列的。 >> reshape(a,1,9) ans = 1 4 7 2 5 8 3 6 9 可以将数组度a变成1行9列的。
以上就是今天的全部内容了,java学习之路不进则退,如果还想了解更多相关java常见问答知识的话,就请一直关注我们网站吧。
推荐阅读: