Unsatisfied answer and no errors

2 views (last 30 days)
Hege
Hege on 26 Jun 2020
Commented: Hege on 27 Jun 2020
Hi,
I am new to the Matlab and I want to develop a 10X10X10 voxel(cube) function programme and set all the voxels on the edges "1" and rest(internal voxels)as "0". Then I have to develop a function to calculate the ratio of "1" and "0" and validate my answer using the hand calculations. I have developed a function to find the voxels on the edges(1) and rest as (0).but i am not satisfied with my answer. there is no error.but the answer is wrong(sum of the voxels on the edges and sum of the internal voxels are wrong). I have selected i,j,k values that matches with the voxels on the edges(1) and internal voxels(0) as below programme written by me using the hand skethced diagram.Appreciate your comments.
b=zeros(10,10,10);
for i=1:10
for j=1:10
for k=1:10
if ((i ==1) || (i==2) || (i==3)||(i==4)||(i==5)||(i ==6) || (i==7) || (i==8)||(i==9)||(i==10)) && ((j==1) || (j==10)) && ((k==1) || (k==10))
b(i,j,k)=1;
else
b(i,j,k)=0;
if ((i ==1) || (i==10)) && ((j==2) || (j==3) || (j==4)||(j==5) || (j==6) || (j==7)||(j==8) || (j==9)) &&( (k==1) || (k==10))
b(i,j,k)=1;
else
b(i,j,k)=0;
if ((i ==1) || (i==10)) && ((k==2) || (k==3) || (k==4)|| (k==5) || (k==6) || (k==7)||(k==8) || (k==9)) && ((j==1) || (j==10))
b(i,j,k)=1;
else
b(i,j,k)=0;
end
end
end
end
end
end
sum b(i,j,k)=1
sum b(i,j,k)=0
note---sum b(i,j,k)=1 shown as 695 and sum b(i,j,k)=0 shown as 694 which is totally wrong.(695+694 is not equal to 10X10X10)

Accepted Answer

Steven Lord
Steven Lord on 26 Jun 2020
sum b(i,j,k)=1
sum b(i,j,k)=0
These lines don't do what you think they do. They are equivalent to:
sum('b(i,j,k)=1')
sum('b(i,j,k)=0')
which means they're adding up the ASCII values of the characters in those two char vectors.
There's an easier way to create your desired array. Let's start off with a 10-by-10-by-10 array filled with 0's just as you did.
A = zeros(10, 10, 10);
Now, for all the columns and pages of A, we want to fill in rows 1 and 10 with the value 1. This uses array indexing with element positions. When you read this, read : as "all".
A([1 10], :, :) = 1; % Elements in rows 1 and 10, all columns, all pages of A
We do the same for all rows and pages of A, filling in columns 1 and 10.
A(:, [1 10], :) = 1; % Elements in all rows, columns 1 and 10, all pages of A
And the same for all rows and columns, filling in pages 1 and 10.
A(:, :, [1 10]) = 1; % Elements in all rows, all columns, pages 1 and 10 of A
Now if we've done it right, A should have an 8-by-8-by-8 array of 0's still in the middle. Let's make sure it has the right number of 0's.
nnz(A == 0) % 512 == 8*8*8
The only other values in A are an outer "shell" of 1's.
nnz(A == 1) % 1000 - 512 = 488
  1 Comment
Hege
Hege on 27 Jun 2020
Hi Steven, Thank you very much for your help.I really appreciate it.

Sign in to comment.

More Answers (0)

Categories

Find more on Creating and Concatenating Matrices in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!