How to delete empty spaces in matrix?

조회 수: 20 (최근 30일)
Tamfor Dulin
Tamfor Dulin 2014년 11월 20일
댓글: Tamfor Dulin 2014년 11월 20일
So I have been trying to remove the empty spaces created by the matrix not selected. The matrix (not shown in code) is identified as MATERIALS(:,:,:). So I tried using:
Y(cellfun('isempty',Y))= [];
but it continues to tell me cellfun works only on cells. Since it said that, I was wondering how to convert all the data into cell arrays but I do not think that is the case.
So, is if there is a way to remove empty spaces from the matrix?
also I was thinking that char (to produce vertical data) was converting the matrix into character array. So would you have to convert that into cell arrays?
so this is part of the code. If it helps.
MATERIALS{1,1,1} = 'KAOWOOL';
MATERIALS{1,1,2} = 'AL';
MATERIALS{1,1,3} = 'PMMA';
MATERIALS{1,2,3} = 'RPMMA';
MATERIALS{1,1,4} = 'HIPS';
MATERIALS{1,2,4} = 'RHIPS';
MATERIALS{1,1,5} = 'Kydex';
MATERIALS{1,2,5} = 'RKydex';
MATERIALS{1,1,6} = 'CB_A';
MATERIALS{1,2,6} = 'RCB_A';
MATERIALS{1,1,7} = 'PEI';
MATERIALS{1,2,7} = 'RPEI';
MATERIALS{1,1,8} = 'PET';
MATERIALS{1,2,8} = 'RPET';
MATERIALS{1,1,9} = 'POM';
MATERIALS{1,2,9} = 'RPOM';
MATERIALS{1,1,10} = 'ABS';
MATERIALS{1,2,10} = 'RABS';
MATERIALS{2,1,11} = 'MIXTURES';
index_selected = get(handles.cmp_list,'Value');
NI = size(index_selected,2);
Matl_index=[10, 2, 6, 4, 1, 5, 7, 8, 3, 9];
for j = 1:NI %Thermodynamics
a{j}=char(MATERIALS{:,1,Matl_index(index_selected(j))});
end
b=char(MATERIALS{:,1,11}); %Mixtures
for j = 1:NI %Kinematics
c{j}=char(MATERIALS{:,2,Matl_index(index_selected(j))});
end
X = char(a);
Z = char(c);
Y = char(X,b,Z);
% C = cellstr(Y); %testing
% C(~cellfun('isempty',C)) = []; %testing
FileName = uiputfile('*.cmp','Save as');
dlmwrite(FileName,Y,'delimiter', '', 'newline', 'pc');
  댓글 수: 2
Guillaume
Guillaume 2014년 11월 20일
A matrix cannot have empty elements. If it's a matrix of char, each element is a single character, some of which can be the space character (ASCII 32) but never empty.
Because, by definition a matrix is square, you cannot remove elements (unless you remove a whole row or column) without reshaping it.
So, you need to better define what you mean by empty spaces ( ' ' or '' ?) and what you mean to obtain.
Your example code is not very useful without the input variables. What would be more useful is a simplified example input matrix and the expected result.
Tamfor Dulin
Tamfor Dulin 2014년 11월 20일
편집: Tamfor Dulin 2014년 11월 20일
So it is not empty but it has [ ]. if you see below there is unnecessary space. All I want to do is remove those spaces. I updated the code.
*Continue to scroll down when looking at file.

댓글을 달려면 로그인하십시오.

채택된 답변

Guillaume
Guillaume 2014년 11월 20일
So, if I understood correctly, what you want to do is remove the blank lines in your Y char array. This is basically removing the rows of the matrix where all columns are equal to ' '. This achieved with:
Y(all(Y == ' ', 2), :) = [];
However, those blank lines are due to the fact that your MATERIALS cell array is a 2*y*z array where most of the (2,:,:) (second row) cells are empty. You then convert both rows of column y and page z into a char array, so the empty row is expanded to spaces.
That would be solved by doing:
a{j} = char(MATERIALS{1,1,Matl_index(index_selected(j))});
instead of
a{j} = char(MATERIALS{:,1,Matl_index(index_selected(j))});
Since you only get one element of the cell array, you could just as well remove the conversion to char:
a{j} = MATERIALS{1,1,Matl_index(index_selected(j))};
And actually you get rid of the for loop and just do:
a = MATERIALS(1, 1, Matl_index(index_selected));
Same for b (with 2nd row) and c (with 1st row again).
I assume you're doing this conversion to char because you want to use dlmwrite to write your text. dlmwrite is not really meant for text writing (char is actually not listed as a supported type), so you're abusing the syntax a bit. You would probably be better off to write your text file with low level functions (fopen, fprintf, fclose), There would be no need to convert to char and you'd have more control over the formatting of the file.
  댓글 수: 1
Tamfor Dulin
Tamfor Dulin 2014년 11월 20일
Sorry to mention... but there is a lot more data then the one you see at the moment. I just wanted to simplify and reduce the code. So that is why I used
a{j} = char(MATERIALS{:,1,Matl_index(index_selected(j))});
same for the loop.
But the
Y(all(Y == ' ', 2), :) = [];
works thank you very much!

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Biological and Health Sciences에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by