索引超出矩阵维度怎么解决?

TheDisguiser 2020-05-27 23:19:07 java常见问答 7471

有时候遇到使用索引会遇到超出矩阵维度的问题,你知道该怎么解决吗?小编这里整理了一些解决方法,快来一起看看吧。

索引中出现超出矩阵维度问题大部分都是由于超界导致的,下面我们就用几个例子来看看如何解决吧。

例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常见问答知识的话,就请一直关注我们网站吧。

推荐阅读:

b树索引是什么?有哪些概念?

数据库索引是什么意思?特点有哪些?

索引的底层原理是什么?它有什么优点和缺点?