2017-07-26 64 views
0

下面我提供基本設置我的問題了參數:無法調試Matlab的循環「下標分配不匹配」的錯誤

%% Parameters 

L = 5; % size of domain 
T = 5; % measurement time 
dx = 1e-2; % position step 
dt = 1e-3; % time step 
x0 = 0; 

%% More Parameters 

t = 0:dt:T; % time vector 
x = (0:dx:L)'; % position vector 
nt = length(t); 
nx = length(x); 
mu = dt/dx; 
eta = dx/dx; 
Lx = (1/dx^2)*spdiags(ones(nx,1)*[1 -2 1],-1:1,nx,nx); % discrete Laplace operator 
B = spdiags(ones(nt,1)*[-eta 1+eta 0],0:1,nt-1,nt); 
phi = @(x) (x>0).*exp(-1./x.^2); 
R = @(x) phi(x).*phi(1-x); 
r = R(x-2); 

%% Get Data 

u = zeros(nx,nt); % preallocate memory 
% initial conditions 
u(:,1) = sinc((x-x0)/dx); 
u(:,2) = sinc((x-x0)/dx); 
for k = 2:nt-1 
    u(:,k+1) = 2*u(:,k) - u(:,k-1) + dt^2*Lx*u(:,k) - dt^2*r.*u(:,k); 
end 

data = u(x==x0,:); 

好了,現在我們有我們所需要的,我可以描述我的問題。在下面我試圖計算一個循環,這將得到我們v,一個5000x501矩陣,可以在內存中的預分配中看到。但是,問題是,當我運行下面的循環時,我立即得到'下標賦值不匹配'錯誤。

%% Solve 

v = zeros(nx,nt-1); % preallocate memory 
v(1,:) = 2*gradient(data); % initial condition 
for l = 1:nx 
    v(l+1,:) = B*v(l,:); 
end 

我已經計算size(v) = 501 5000size(B) = 5000 50001size(v(l,:)) = size(v(1,:)) = 1 5000,因此,由於nx = 500,就應該所有的工作;但由於某種原因,它沒有。

+0

'B * v(l,:)'會給你一個'Inner matrix dimensions must agree'錯誤。 「下標分配不匹配」錯誤發生在哪條線上? – gnovice

+0

@gnovice錯誤發生在我們有'v(l + 1,:) = B * v(l,:);' –

+0

@flawr的行那裏,'B'有501行和5000列,因此執行循環爲'l = 1:nx'應該產生一個RHS,自從'nx = 501'後也有501行。 –

回答

2

你的錯誤是在循環之前發生,以下行:

v(1,:) = 2*gradient(data); % initial condition 

左手邊是1 * 5000,而右手邊是1 * 5001。

即使你解決這個問題,你要在循環運行到一個問題,由於B*v(l,:)操作:

>> B*v(l,:) 
Error using * 
Inner matrix dimensions must agree. 

這是因爲matrix multiplication要求的B第二維(這是5001 )必須等於v(l,:)(它是1)的第一維。因爲它被分配到v(l+1,:),您還必須確保結果是一個行向量。

相關問題