Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 具有三维矩阵和向量的非一致变元_Matlab_Octave - Fatal编程技术网

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。