Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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数组中替换dim3_Arrays_Matlab_Indexing - Fatal编程技术网

Arrays 在matlab数组中替换dim3

Arrays 在matlab数组中替换dim3,arrays,matlab,indexing,Arrays,Matlab,Indexing,如果假设为3x3x3阵列,如果满足条件,如何替换整个dim3?给定数组的位置 A = [1 2 3; 4 1 6; 7 8 1]; A(:, :, 2) = [1 2 3; 4 2 6; 7 8 2] A(:, :, 3) = [1 2 3; 4 3 6; 7 8 3] 在这个简单的例子中,有两个DIM3包含[1,2,3],分别位于A(2,2,:)和A(3,3,:)上。例如,我如何用[10]替换它们。这看起来很简单,但我就是无法理解 编辑:我过分简化了这个问题,replacemnt向量应该更像

如果假设为3x3x3阵列,如果满足条件,如何替换整个dim3?给定数组的位置

A = [1 2 3; 4 1 6; 7 8 1];
A(:, :, 2) = [1 2 3; 4 2 6; 7 8 2]
A(:, :, 3) = [1 2 3; 4 3 6; 7 8 3]
在这个简单的例子中,有两个DIM3包含
[1,2,3]
,分别位于
A(2,2,:)
A(3,3,:)
上。例如,我如何用
[10]
替换它们。这看起来很简单,但我就是无法理解

编辑:我过分简化了这个问题,replacemnt向量应该更像
[11 12 13]
查找(X,Y)-索引不是实际问题

我正在寻找一种干净且内存高效的方法,用[11 12 13]获得输出来替换
a(2,2,:)
a(3,3,:)
: A(:,:,1)=


在这种情况下,我不知道在现实世界中有多少元素需要替换…

替换三维元素只是一个任务

A(2,2,:) = 10;
A(:,:,1) =
     1     2     3
     4    10     6
     7     8     1    
A(:,:,2) =
     1     2     3
     4    10     6
     7     8     2 
A(:,:,3) =
     1     2     3
     4    10     6
     7     8     3
如果您试图确定1,2,3模式在三维中的位置,您可以这样做:

idx= A(:,:,1) == 1 & A(:,:,2) ==2 & A(:,:,3) == 3;
idx= repmat(idx,1,1,3);
A(idx) = 10;
其结果是:

A(:,:,1) =
     1     2     3
     4    10     6
     7     8    10
A(:,:,2) =
     1     2     3
     4    10     6
     7     8    10
A(:,:,3) =
     1     2     3
     4    10     6
     7     8    10

我根据Aero Engy之前的帖子,不知怎的想出了一个解决方案,但它非常难看,因为它需要在一个循环中添加一个符号——有人对矢量化版本有想法吗

A = [1 2 3; 4 1 6; 7 8 1];
A(:, :, 2) = [1 2 3; 4 2 6; 7 8 2];
A(:, :, 3) = [1 2 3; 4 3 6; 7 8 3];

Target = [1 2 3];
Replacement = [11 12 13];

idx = find(A(:,:,1) == Target(1) & A(:,:,2) == Target(2) & A(:,:,3) == Target(3));
[x, y, ~] = ind2sub(size(A), idx);

for i = 1:length(x) 
A(x(i), y(i), 1) = Replacement(1);
A(x(i), y(i), 2) = Replacement(2);
A(x(i), y(i), 3) = Replacement(3);
end

只是一些逻辑索引(Matlab 2016b及更高版本):

Matlab 2016b之前的版本也是如此:

idx = all(bsxfun(@eq,A,permute(target,[1 3 2])),3);
A(logical(bsxfun(@times,idx,ones(1,1,size(A,3))))) = repelem(replacement,1,nnz(idx));

替换为
A(2,2,:)=10
A(3,3,:)=10[10 10 10]
作为替换-我真的想放一个像
[10 11 12]
这样的向量,所以简单的索引对这种情况不起作用…非常感谢!有趣的是,它并不比带循环的verison快。至少对于
2769x2694x3单元8
target = [1 2 3]; % the vector you want to find
replacement = [11 12 13]; % the vector you want to replace it with

% find the 2d indexes where the target is found
idx = all(A == permute(target,[1 3 2]),3); 
% replace found indexes with replacement vector
A(logical(idx.*ones(1,1,size(A,3)))) = repelem(replacement,1,nnz(idx));
idx = all(bsxfun(@eq,A,permute(target,[1 3 2])),3);
A(logical(bsxfun(@times,idx,ones(1,1,size(A,3))))) = repelem(replacement,1,nnz(idx));