Operations on 3d array without using for loop
4 次查看(过去 30 天)
显示 更早的评论
I am trying to write the following code without for loops
gf_k = gf(0:3,2); % gf is a Galois-field matlab function
gf_a = gf(a, 2); % gf is a Galois-field matlab function
for i = 1 : l
for j = 1 : h
for k = 0 : 3
c = gf_k.x(k+1) + gf_a.x(i,j); % As both gf_k and gf_a are GF(4) variables, Value of c is between any of 0,1,2,3
D(i,j,k+1) = B(i,j,k+1) + A(i,j,c+1);
end
end
end
I tried using sub2ind but I couldn't get right.
5 个评论
Bruno Luong
2023-9-4
This line of code is perhaps wrong
c = gf_k.x(k+1) + gf_a.x(i,j);
it adds two double and not GF(4) elements.
采纳的回答
Bruno Luong
2023-9-4
编辑:Bruno Luong
2023-9-4
I don't have communication tbx, so I code this blindly
l = 300;
h = 400;
a = randi([0,3], l, h);
gf_k = gf(0:3,2);
gf_a = gf(a, 2);
A = rand(l,h,4);
B = rand(l,h,4);
% Addition table of GF(4)
[X,Y] = ndgrid(0:3);
GF4_addTable = (gf(X,2) + gf(Y,2));
GF4_addTable = GF4_addTable.x;
%GF4_addTable = [...
% 0 1 2 3;
% 1 0 3 2;
% 2 3 0 1;
% 3 2 1 0 ];
tic
gf_k_x = gf_k.x;
gf_a_x = gf_a.x;
gf_k_x = reshape(gf_k_x, [1 1 4]);
ilin = 1 + gf_a_x + 4*gf_k_x;
c = GF4_addTable(ilin); % gf_k_x + gf_a_x; in GF4
D = B + A((1:l)'+l*((0:h-1)+h*double(c)));
toc
2 个评论
Bruno Luong
2023-9-5
编辑:Bruno Luong
2023-9-5
"gf_a_x is of dim(l,h) and gf_k_x is of dim(1,1,4). How can we add these two?"
via auto expansion https://blogs.mathworks.com/loren/2016/10/24/matlab-arithmetic-expands-in-r2016b/
A((1:l)'+l*((0:h-1)+h*double(c)));
... Looks like you are using linear indexing. Is this correct?
Correct. It does the work like sub2ind but with auto-expansion capability and without the overhead of verification for overflow that I don't need.
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Loops and Conditional Statements 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!