Unsatisfied answer and no errors

2 次查看(过去 30 天)
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)

采纳的回答

Steven Lord
Steven Lord 2020-6-26
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 个评论
Hege
Hege 2020-6-27
Hi Steven, Thank you very much for your help.I really appreciate it.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息

产品

Community Treasure Hunt

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

Start Hunting!

Translated by