Matlab 具有三维矩阵和向量的非一致变元
我想在三维矩阵和向量之间执行以下元素加法Matlab 具有三维矩阵和向量的非一致变元,matlab,octave,Matlab,Octave,我想在三维矩阵和向量之间执行以下元素加法 for l = 1:dim M_star(j,k,:) .+= 15*x(j,:).*x(k,:).*x(l,:).*x_t(l,:)./(nm.^7) - (l == j)*3*x(l,:).*x_t(l,:).*(sum(x.^2))./(nm.^7) - (l == k)*3*(x(l,:).*x_t(l,:)).*(sum(x.^2))./(nm.^7) endfor 但我得到了以下错误: error: =: nonconformant
for l = 1:dim
M_star(j,k,:) .+= 15*x(j,:).*x(k,:).*x(l,:).*x_t(l,:)./(nm.^7) - (l == j)*3*x(l,:).*x_t(l,:).*(sum(x.^2))./(nm.^7) - (l == k)*3*(x(l,:).*x_t(l,:)).*(sum(x.^2))./(nm.^7)
endfor
但我得到了以下错误:
error: =: nonconformant arguments (op1 is 101x101x101, op2 is 101x101)
例如,我已经检查了加法是否适用于单个向量
A .+= 15*x(j,:).*x(k,:).*x(l,:).*x_t(l,:)./(nm.^7) - (l == j)*3*x(l,:).*x_t(l,:).*(sum(x.^2))./(nm.^7) - (l == k)*3*(x(l,:).*x_t(l,:)).*(sum(x.^2))./(nm.^7)
在初始化为的情况下工作
A = zeros(1,N) % N = 101 in this case
x、 x_t,nm是1 x 101向量,而j,k,l是变量
% initial conditions
x0 = sin(2.5*pi*SpaceSpan);
x = ones(dim, 1)*x0; % initial states
x_t = x
nm = zeros(1, N);
M_star = zeros(N,N,N);
但是下面的方法也不起作用
M_star(j,k,:) .+= A
多谢各位
编辑:完整代码
% Generalized Newtonian with a simple Crank-Nicolson method (implicit method)
clc;
clear;
% initialize
k = 0.01; % space step
h = 0.01; % time step
T = 10;
dim = 10; % number of dimensions
SpaceSpan = (0:k:1);
TimeSteps = round(T/h);
N = length(SpaceSpan);
% initial conditions
x0 = sin(2.5*pi*SpaceSpan);
x = ones(dim, 1)*x0; % initial states
x_t = x
x_tt = x
b = ones(dim, 1)*x0;
gradb = zeros(dim, dim, N);
nm = zeros(1, N);
MaxSteps = 1000000; % max steps for path evolution
TolErr = 1e-6; % termination tolerance
TimeSteps = round(T/h);
XSpan = (0:k:1);
% generate important matrices
L2 = (-2*diag(ones(N-4,1)) + diag(ones(N-5,1),-1) + diag(ones(N-5,1),1))/k^2;
L4 = (6*diag(ones(N-4,1)) - 4*diag(ones(N-5,1),-1) - 4*diag(ones(N-5,1),1) + diag(ones(N-6,1),-2) + diag(ones(N-6,1),2))/k^4;
M_star = zeros(N,N,N) % M star matrix
% reparametrization
c = zeros(N,1);
c(end) = 1/k^2;
% evolution
for i = 1:TimeSteps
x_ = x % old x
b_ = b % old b
gradb_ = gradb % old Jacobian matrix b
for w = 1:N
nm(w) = sqrt(sum(x(:,w).^2))
if (w == 1)||(w == N)
x_t(:,w) = 0
x_tt(:,w) = 0
else
x_t(:,w) = (x(:,w+1)-x(:,w-1))/2/k
x_tt(:,w) = (x(:,w+1)-2*x(:,w)+x(:,w-1))/k^2
end
end
%%
for j = 1:dim % assign value to b
b(j,:) = -x(j,:)./nm.^3
for k = 1:dim % assign value to Jacobian matrix gradb
if j == k
gradb(j,k,:) = (sum(x.^2).-3*x(j,:).^2)./(nm.^5)
for l = 1:dim
M_star(j,k,:) .+= (15*x(j,:).^2.-3*sum(x.^2)).*x(l,:).*x_t(l,:)./(nm.^7) - (l == j)*6*sum(x.^2).*x(l,:).*x_t(l,:)./(nm.^7) % unable to perform compounded addition
endfor
else
gradb(j,k,:) = -3*x(j,:).*x(k,:)./(nm.^5)
for l = 1:dim
M_star(j,k,:) .+= 15*x(j,:).*x(k,:).*x(l,:).*x_t(l,:)./(nm.^7) - (l == j)*3*x(l,:).*x_t(l,:).*(sum(x.^2))./(nm.^7) - (l == k)*3*(x(l,:).*x_t(l,:)).*(sum(x.^2))./(nm.^7)
endfor
end
endfor
endfor
% implicit method, note that M* is derived explicitly (backward in time)
x(3:end-2) = inv(L4 - (gradb.' + gradb)*L2)*(x(3:end-2) + M_star*x_t(3:end-2) - gradb.'*b) % implicit solve
% plot
if mod(i,PlotFrequency) == 0
subplot(1,2,1);
set(data,'xdata',SpaceSpan,'ydata',u)
title(['Steps=',num2str(i),' Change=',num2str(change)]);
subplot(1,2,2);
plot([1:TimeSteps],integrand);
title(['Integrand of action (action=',0,')']);
drawnow;
end
endfor
您可以执行以下操作: 假设ABC为101x101,假设M_星为101x1011x101 M_star+repmat(ABC[1,1101])
举个例子:这真的很难读,我不知道j,k,nm和x是什么。一般来说:对于二维,Matlab对定义不清的操作非常宽容,但从3维开始,你必须非常精确。我找到了解决方案。结果是,我有一些维度上的不一致性,也就是说我应该转置RHS,因为LHS是列向量,而RHS是行向量。然而,不知何故它仍然不起作用,我不得不添加一个临时向量来存储值。以下是解决方案:
for j = 1:dim % assign value to b
b(j,:) = -x(j,:)./nm.^3
for k = 1:dim % assign value to Jacobian matrix gradb
if j == k
gradb(j,k,:) = (sum(x.^2).-3*x(j,:).^2)./(nm.^5)
for l = 1:dim
temp .+= ((15*x(j,:).^2.-3*nm.^2).*x(l,:).*x_t(l,:)./(nm.^7) - (l == j)*6.*nm.^2.*x(l,:).*x_t(l,:)./(nm.^7)).'
endfor
M_star(j,k,:) = temp
else
gradb(j,k,:) = -3*x(j,:).*x(k,:)./(nm.^5)
for l = 1:dim
temp .+= (15*x(j,:).*x(k,:).*x(l,:).*x_t(l,:)./(nm.^7) - (l == j)*3*x(l,:).*x_t(l,:).*(sum(x.^2))./(nm.^7) - (l == k)*3*(x(l,:).*x_t(l,:)).*(sum(x.^2))./(nm.^7)).'
endfor
M_star(j,k,:) = temp
end
endfor
endfor
你在用八度音阶吗?如果是,请在我使用的八度音阶中进行更正,它与matlab有很大不同吗?有很多相似之处,也有不同之处。但给它贴错标签可能会导致不相关的解决方案。所以请好好照顾它。还请提供您的代码使用的输入矩阵的小样本,以便我们可以运行您的代码来解决有关编辑的问题,如果
x
,x\u t
和nm
是1x101向量,那么j
,k
和l
必须是一个,否则,您将尝试使用无效索引,因为只有一行。因此,如果l
等于1
,循环的目的也会丢失。请看,然后回答你的问题accordingly@Huy-胡安圭ễn提供我们可以复制粘贴并运行的代码。当前代码不能这样使用。请尝试解释您要应用的公式。它非常复杂,我们可以猜测j,k,l是变量,而nm是一个1 x 101的向量。ABC实际上是一个1 x 101向量,由累积和的RHS定义。对于你的建议,我仍然有不一致的论点错误。你能详细说明如何处理3+维度吗?我尝试使用for循环并手动赋值,但失败了。感谢括号中的元素是ABC在每个维度中复制的频率,因此在我的示例中,在dim-1中复制一次,在dim-2中复制一次,在dim-3中复制101次。在该向量中为维度4及以上添加更多条目。例如,repmat(ABC,[1,1102103,1])用于维度4和5中的102和103个复制,并通过在其中执行单个复制来简单地添加维度6。