matlab sub2ind与3D矩阵

zaq34kh6  于 2023-04-06  发布在  Matlab
关注(0)|答案(1)|浏览(148)

给定一个代码,例如,像这样

A=rand(10,10); 

indX(:,:,1)=[2,3;1,6];  indX(:,:,2)=[2,5;2,6]; 
indY(:,:,1)=[4,6;2,3];  indY(:,:,2)=[7,5;3,4]; 

for i=1:2
    for j=1:2

        ind=sub2ind(size(A), indX(:,:,i), indY(:,:,j));
        figure,imagesc(A(ind));

    end
end

我想得到同样的结果,不使用for循环。有没有更快的方法?

2q5ifsrm

2q5ifsrm1#

N=10;  % size square A
L=10;    % height nX nY
M=2;    % size nX nY square base

A=randi(N,N)

nX=randi([1 N],M,M,L);
nY=randi([1 N],M,M,L);

1.-只是为了确保理解imagesc的工作原理

这是NxN像素化矩阵图;
imagesc(A)

而这只是一个单一的像素大小的整个图像

figure;
image(A(3))

这是你想要的吗?还是你想打开并改变初始图像c(A)的单个像素,保持A不变?

close all

我觉得你真正想要的是第二个:

  • 改变单个像素,
  • 或者一次一个像素地填充整个矩阵,
  • 或者一次只接通一个像素,
  • 或者交换像素,
  • 或者让他们眨眼

以上任何一项,或任何其他不包括的,
然而,在图中持有整个imagesc(A),而不仅仅是imagesc(A(4))
如果不是这样,请纠正我,但是如果你真的想通过colorbar像信号量一样移动整个图,那么无论如何都不需要在问题中发布代码。
让我们继续这样的假设。

2.-获取所有X Y组合

nXnY真的有必要是正方形吗?

n2X=reshape(nX,[M*M L])';
n2Y=reshape(nY,[M*M L])';

[X,Y]=meshgrid([1:L],[1:L]);
W=[X(:) Y(:)];

Lx=[];Ly=[];
for k=1:1:size(W,1)
    Lx=[Lx n2X(W(k,1),:)];
    Ly=[Ly n2Y(W(k,2),:)];
end

L=[Lx;Ly];

现在,L包含使用双for循环生成的所有索引对

**3.-让它 Flink **

显示结果,因为不清楚你是否想打开/关闭关闭/打开 Flink 单个像素,或交换,或任何..我去 Flink 。

figure;
ax=gca
hold all

hm=imagesc(A)
ax.DataAspectRatio=[1 1 1];

for k=1:1:size(L,2)
    d=A(L(1,k),L(2,k))
    A(L(1,k),L(2,k))=0;
    imagesc(A);
    drawnow % limitrate nocallbacks
   % pause(.5);
    A(L(1,k),L(2,k))=d;
    imagesc(A);
    drawnow % limitrate nocallbacks
    % pause(.5);

end

4.-只调用一次数字

也不需要在忙碌for循环中调用command figure
我知道你说不for循环,但是提前构建所有索引的序列是关键点,这将保存你在问题中要求的代码时间。
谢谢你阅读我的答案。

相关问题