Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.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
Arrays 向量与矩阵不一致的matlab数组索引?_Arrays_Matlab_Matrix_Indexing - Fatal编程技术网

Arrays 向量与矩阵不一致的matlab数组索引?

Arrays 向量与矩阵不一致的matlab数组索引?,arrays,matlab,matrix,indexing,Arrays,Matlab,Matrix,Indexing,以下问题让我头痛不已: 我正在用矩阵索引维数为Nx1的向量R,即: R = ones( [ N nSteps ] ); R = (:); 有一个标记矩阵。基本上,矩阵的每一行都是一行标记,我需要存储在R中的值,这是指R中的向量与R中当前点的不同偏移量。矩阵的结果如下: k = 0:nSteps; I = repmat( k , [size(D,2) 1]) I = bsxfun(@minus, I , D'); % later in code, this is used as: currI =

以下问题让我头痛不已:

我正在用矩阵索引维数为Nx1的向量R,即:

R = ones( [ N nSteps ] );
R = (:);
有一个标记矩阵。基本上,矩阵的每一行都是一行标记,我需要存储在R中的值,这是指R中的向量与R中当前点的不同偏移量。矩阵的结果如下:

k = 0:nSteps;
I = repmat( k , [size(D,2) 1])
I = bsxfun(@minus, I , D');
% later in code, this is used as:
currI = currPoint + currI;
% this is used for indexing just a little later
... R(currI) ...
在这个例子中,D是一个数组,它存储了我想要的不同偏移量。它在大多数情况下都能很好地工作,并提供了维度数组[size(D,2)nSteps],这是我可以使用的索引的结果

问题从这里开始:偏移量作为参数传递给函数,并且可以变化。每当我尝试只使用一个简单的偏移量时,例如400,我就会遇到问题。Matlab似乎并不关心某个对象是否被1xN或Nx1向量索引,并且在本例中总是返回一个维数为[nSteps 1]而不是[1 nSteps]的向量。当结果用于bsxfun调用时,该函数的结果不再是[size(D,2)nSteps]矩阵,而是[nSteps nSteps]矩阵,我对此无能为力,并且在算法上下文中定义不清


TLDR:我能让matlab在索引R(1:400)时给我一个1 x N数组而不是一个N x 1数组吗?我可以强制与矩阵索引保持一致吗?

我可能不完全确定你在这里的意思,但我可以在matlab中解释一下向量。我认为您的问题与没有正确指定尺寸有关

初始化为
vec(1:anyNbr)=someNbr%的向量或大小相同的向量始终是行向量。要使其成为列向量,可以执行
vec(1:anyNbr,1)=someNbr

操作符
(:)
重新排列指向向量中每个元素的指针,创建列向量。这也意味着矩阵变成了列向量。
重塑(vec,numel(vec),1)
的操作速度更快

matlab向量中的元素是按列索引的,这意味着

r = [1,4,7;2,5,8;3,6,9];
r(:)
给出一个列向量
[1;2;3;4;5;6;7;8;9]

但是,将变量定义为
vec=something
将使
vec
something
完全相同。此外,如果变量已初始化,则赋值
vec(1:anyNbr)=something
,将
something
赋值给定义了
vec
的维度。因此,如果
vec
是一个列向量,它将保持原样


因此,在定义向量和矩阵时需要考虑的是,有时必须在初始化时指定维度。您可能知道其中的大部分,但我不知道您的问题是什么,因此,如果我提供的信息太多,我很抱歉。

据我所知,问题(我自己的代码也有问题)可以如下所示:

Data1 = rand(1,12);
Data2 = rand(3,4);
Data3 = rand(12,1);
Index1 = reshape(1:12,[12,1]);
Index2 = reshape(1:12,[6,2]);
Index3 = reshape(1:12,[3,4]);
Index4 = reshape(1:12,[2,6]);
Index5 = reshape(1:12,[1,12]);
[size(Data1(Index1)),size(Data2(Index1)),size(Data3(Index1));
size(Data1(Index2)),size(Data2(Index2)),size(Data3(Index2));
size(Data1(Index3)),size(Data2(Index3)),size(Data3(Index3));
size(Data1(Index4)),size(Data2(Index4)),size(Data3(Index4));
size(Data1(Index5)),size(Data2(Index5)),size(Data3(Index5))]
[size(reshape(Data1(Index1),size(Index1))),size(reshape(Data2(Index1),size(Index1))),size(reshape(Data3(Index1),size(Index1)));
size(reshape(Data1(Index2),size(Index2))),size(reshape(Data2(Index2),size(Index2))),size(reshape(Data3(Index2),size(Index2)));
size(reshape(Data1(Index3),size(Index3))),size(reshape(Data2(Index3),size(Index3))),size(reshape(Data3(Index3),size(Index3)));
size(reshape(Data1(Index4),size(Index4))),size(reshape(Data2(Index4),size(Index4))),size(reshape(Data3(Index4),size(Index4)));
size(reshape(Data1(Index5),size(Index5))),size(reshape(Data2(Index5),size(Index5))),size(reshape(Data3(Index5),size(Index5)]
matlab(我认为是通过设计)给出了那些不一致的结果(在这里用strike-thru粗体值标记)

现在测试如下:

Data1 = rand(1,12);
Data2 = rand(3,4);
Data3 = rand(12,1);
Index1 = reshape(1:12,[12,1]);
Index2 = reshape(1:12,[6,2]);
Index3 = reshape(1:12,[3,4]);
Index4 = reshape(1:12,[2,6]);
Index5 = reshape(1:12,[1,12]);
[size(Data1(Index1)),size(Data2(Index1)),size(Data3(Index1));
size(Data1(Index2)),size(Data2(Index2)),size(Data3(Index2));
size(Data1(Index3)),size(Data2(Index3)),size(Data3(Index3));
size(Data1(Index4)),size(Data2(Index4)),size(Data3(Index4));
size(Data1(Index5)),size(Data2(Index5)),size(Data3(Index5))]
[size(reshape(Data1(Index1),size(Index1))),size(reshape(Data2(Index1),size(Index1))),size(reshape(Data3(Index1),size(Index1)));
size(reshape(Data1(Index2),size(Index2))),size(reshape(Data2(Index2),size(Index2))),size(reshape(Data3(Index2),size(Index2)));
size(reshape(Data1(Index3),size(Index3))),size(reshape(Data2(Index3),size(Index3))),size(reshape(Data3(Index3),size(Index3)));
size(reshape(Data1(Index4),size(Index4))),size(reshape(Data2(Index4),size(Index4))),size(reshape(Data3(Index4),size(Index4)));
size(reshape(Data1(Index5),size(Index5))),size(reshape(Data2(Index5),size(Index5))),size(reshape(Data3(Index5),size(Index5)]
将给出:

ans = 12 1 12 1 12 1 6 2 6 2 6 2 3 4 3 4 3 4 2 6 2 6 2 6 1 12 1 12 1 12 ans= 12 112 1 6 2 6 2 6 2 3 4 3 4 3 4 2 6 2 6 2 6 11211121122
我不完全确定我是否理解了你的问题,但问题是如果你将一个变量初始化为(1:10)=1(10,1),你会得到一个行向量,但R(:)总是给出一个列向量?问题是,在一般情况下,我用一个矩阵索引R,例如5x400矩阵,它会给我一个5x400矩阵作为回报。R是一个向量,目前约为16000000x1。现在,有时,我索引的矩阵实际上只是一个1x400矩阵。这导致我得到了一个400x1的向量,而不是我需要的1x400。因为我想在一种情况下处理所有问题,我不能简单地转换向量,它会影响其他解决方案。也许我首先应该这么说:xBe更具体地解释为什么你不能简单地转换结果。这似乎是一条路要走。结果将在以后使用,并且维度很重要,因为我在bsxfun中使用它。但是我得到了两种不同的维数,这取决于我传递的一个参数,我真的不想这样。或者:1次,D是偏移量数组,我创建一个矩阵来索引R数组,我得到一个矩阵,它是D中的元素数乘以原始索引向量的长度。然而,下一次,D只是一个数字,或者是一个1x1向量,现在我得到了一个矩阵,它是索引向量在第一维的大小,在第二维是1,而不是相反,这是第一种情况下发生的。这让我很恼火。