Храните и создавайте две структуры в MATLAB - PullRequest
0 голосов
/ 01 июня 2018

Я работаю со структурами, две из которых показаны ниже; A и B .Мне нужно хранить A и B таким образом (возможно, без использования таблиц), который позволяет MATLAB отображать их аналогично изображениям.


Structures

1 Ответ

0 голосов
/ 02 июня 2018

С моей точки зрения, создание разреженной матрицы и сохранение в ней кружков может быть решением.Вот функция, которая может генерировать круговой массив в разреженной матрице с заданной структурой и цветом.Вам нужно создать таблицу, в которой обозначен цвет каждого элемента (0 означает, что в этой позиции ничего нет).

Функция CircleArrays.m

function [Imgout] = CircleArrays(DataIn,r,s)
%%Draw a circle array with given colors 
% Parameters:
% DataIn ---- structures & color
%   r    ---- the radius of each circle
%   s    ---- the sparsity of the data
% Demo:
% S=rand(10);
% r=20;   
% sparsity=1; 
% Img=CircleArrays(S,r,sparsity);
% figure()
% colormap(hot)
% imagesc(1-Img)
% axis equal
% axis off

%Define a pre-allocate sparse matrix
[m,n]=size(DataIn);
Imgout=spalloc(m*(2*r+1),n*(2*r+1),floor(n*(2*r+1)*m*(2*r+1)*s));

%Create the Mask
I = 1:(2*r+1);             % Define the x and y coordinates of the basic mask
x = (I - r)-1;
y = (r - I)+1;
[X,Y] = meshgrid(x,y);      % Create the mask
M = (X.^2 + Y.^2 <= r^2);   
[xx,yy]=ind2sub(size(M),find(M == true)); 

%%Add circles into the matrix
for ii=1:m
  for jj=1:n
    if (DataIn(ii,jj) == 0) 
      continue;
    else
      MidX=(ii-1)*(2*r+1)+r+1;
      MidY=(jj-1)*(2*r+1)+r+1;
      Imgout(sub2ind(size(Imgout),MidX+xx-r-1,MidY+yy-r-1))=DataIn(ii,jj);
    end
  end
end

end

DEMO:

clc; clear;
%%Structures & configs
% define structures & color
S=[0 0 0 0 0 0 0 0 0 0 0 0 0 0;
   0 0 0 0 0 0 0 0 0 0 0 0 0 0;
   0 0 0 1 0 0 0 0 0 0 1 0 0 0;
   0 0 0 1 0 0 0 0 0 0 1 0 0 0;
   0 0 0 1 0 0 0 0 0 0 1 0 0 0;
   0 0 0 1 0 0 0 0 0 0 1 0 0 0;
   0 0 0 1 0 0 0 0 0 0 1 0 0 0;
   0 0 0 .6 0.6 .6 .6 .6 .6 .6 .6 0 0 0;
   0 0 0 1 0 0 0 0 0 0 1 0 0 0;
   0 0 0 1 0 0 0 0 0 0 1 0 0 0;
   0 0 0 1 0 0 0 0 0 0 1 0 0 0;
   0 0 0 1 0 0 0 0 0 0 1 0 0 0;
   0 0 0 1 0 0 0 0 0 0 1 0 0 0;
   0 0 0 0 0 0 0 0 0 0 0 0 0 0;
   0 0 0 0 0 0 0 0 0 0 0 0 0 0;];
%set the radius of each circle and the sparsity of the data
r=20;   
sparsity=0.25; 
%generate the Structures
Img=CircleArrays(S,r,sparsity);

%%Draw the picture
figure()
colormap(hot)
imagesc(1-Img)
axis equal
axis off
  1. вывод по коду DEMO: enter image description here
  2. вывод по коду DEMO в функции: enter image description here

Примечания: я написал эту функцию на основе одного из моих старых ответов , поэтому круговая маска, возможно, не на 100% идеальна, вы можете изменить ее на любую, какую захотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...