Mentions légales du service

Skip to content
Snippets Groups Projects
Commit 19c46a48 authored by Nicolas Bellot's avatar Nicolas Bellot Committed by hhakim
Browse files

otipmisation du slicing pour la classe faust matlab

parent ca2d9c95
Branches
Tags
No related merge requests found
......@@ -34,7 +34,7 @@ if(BUILD_MATLAB_MEX_FILES)
add_test(NAME FAUST_HADAMARD_MEX COMMAND matlab -nojvm -r "try;testpass=0;addpath('${FAUST_BIN_TEST_BIN_DIR}','${FAUST_BIN_TEST_TOOLS_DIR}');set_path;hier_fact_test('config_HADAMARD',5941,1);catch ME ;testpass=-1;disp(getReport(ME)); end ; exit(testpass)")
add_test(NAME DEMO_MATLAB COMMAND matlab -nodesktop -r "try;testpass=0;addpath('${FAUST_MATLAB_INSTALL_DIR}');setup_FAUST;run_all_demo;catch ME ;testpass=-1;disp(getReport(ME)); end ; exit(testpass)")
add_test(NAME FAUST_MEX COMMAND matlab -nojvm -r "try;testpass=0;addpath('${FAUST_BIN_TEST_BIN_DIR}','${FAUST_BIN_TEST_TOOLS_DIR}');set_path;test_matlab_faust;catch ME ;testpass=-1;disp(getReport(ME)); end ; exit(testpass)")
add_test(NAME SPEED_FAUST_MEX COMMAND matlab -nojvm -r "try;testpass=0;addpath('${FAUST_BIN_TEST_BIN_DIR}','${FAUST_BIN_TEST_TOOLS_DIR}');set_path;test_matlab_faust_time;catch ME ;testpass=-1;disp(getReport(ME)); end ; exit(testpass)")
add_test(NAME SPEED_MATLAB_FAUST COMMAND matlab -nojvm -r "try;testpass=0;addpath('${FAUST_BIN_TEST_BIN_DIR}','${FAUST_BIN_TEST_TOOLS_DIR}');set_path;test_matlab_faust_time;catch ME ;testpass=-1;disp(getReport(ME)); end ; exit(testpass)")
......
......@@ -99,47 +99,26 @@ end
disp('Ok');
%% slicing test
disp('TEST SLICING : ');
for i=1:dim1
for j=1:dim2
F_i_j=F(i,j);
if (size(F_i_j) ~= [1 1])
error('invalid size of F(i,j)');
end
if (F_i_j ~= F_dense(i,j))
error('F(i,j) ~= F_dense(i,j)');
end
end
end
F_slice_slice=F(:,:);
if (size(F_slice_slice,1) ~= dim1) | (size(F_slice_slice,2) ~= dim2)
error('invalid dimension');
end
if (F_slice_slice ~= F_dense)
error('F(:,:) ~= F_dense');
end
F_slice_slice_2=F(1:dim1,1:dim2);
if (size(F_slice_slice_2,1) ~= dim1) | (size(F_slice_slice_2,2) ~= dim2)
error('invalid dimension');
end
if (F_slice_slice_2 ~= F_dense)
error('F(1:dim1,1:dim2) ~= F_dense');
end
F_inv=F(dim1:-1:1,dim2:-1:1);
if (size(F_inv,1) ~= dim1) | (size(F_inv,2) ~= dim2)
error('invalid dimension');
end
if (F_inv ~= F_dense(dim1:-1:1,dim2:-1:1))
error('F(1:dim1,1:dim2) ~= F_dense(dim1:-1:1,dim2:-1:1)');
end
disp('Ok');
%%% transpose test
......@@ -201,6 +180,79 @@ disp('Ok');
%% slicing test
disp('TEST SLICING : ');
for i=1:dim1
for j=1:dim2
F_i_j=F(i,j);
F_trans_j_i=F_trans(j,i);
if (size(F_i_j) ~= [1 1])
error('invalid size of F(i,j)');
end
if (size(F_trans_j_i) ~= [1 1])
error('invalid size of F_trans(j,i)');
end
if (F_i_j ~= F_dense(i,j))
error('F(i,j) ~= F_dense(i,j)');
end
if (F_trans_j_i ~= F_dense_trans(j,i))
error('F(j,i) ~= F_dense_trans(j,i)');
end
end
end
F_slice_slice=F(:,:);
if (size(F_slice_slice,1) ~= dim1) | (size(F_slice_slice,2) ~= dim2)
error('invalid dimension');
end
if (F_slice_slice ~= F_dense)
error('F(:,:) ~= F_dense');
end
F_trans_slice_slice=F_trans(:,:);
if (size(F_trans_slice_slice,1) ~= dim2) | (size(F_trans_slice_slice,2) ~= dim1)
error('invalid dimension');
end
if (F_trans_slice_slice ~= F_dense')
error('F_trans(:,:) ~= F_dense''');
end
F_slice_slice_2=F(1:dim1,1:dim2);
if (size(F_slice_slice_2,1) ~= dim1) | (size(F_slice_slice_2,2) ~= dim2)
error('invalid dimension');
end
if (F_slice_slice_2 ~= F_dense)
error('F(1:dim1,1:dim2) ~= F_dense');
end
F_inv=F(dim1:-1:1,dim2:-1:1);
if (size(F_inv,1) ~= dim1) | (size(F_inv,2) ~= dim2)
error('invalid dimension');
end
if (F_inv ~= F_dense(dim1:-1:1,dim2:-1:1))
error('F(1:dim1,1:dim2) ~= F_dense(dim1:-1:1,dim2:-1:1)');
end
disp('Ok');
......@@ -288,6 +340,17 @@ end
disp('Ok');
%% test multiplication with matrix
disp('TEST MULTIPLICATION BY A MATRIX : ');
X=zeros(dim2,dim3);
......
%% Description test_faust_transform
% This script tests the malab_faust class, i.e the different method
% overloaded for a faust (constructor, size, mtimes, mtimes_trans ...)
% This script tests the malab_faust class from a time computing point of view
nb_fact = 3;
dim1 = 8000;
dim2 = 200;
dim1 = 1000;
dim2 = 500;
dim3 = 10;
int_max= 100;
nb_transposition = 100;
nb_multiplication_vector = 100;
nb_access_coeff = 100;
disp('****** TEST MATLAB_FAUST ******* ');
%% creation du faust
......@@ -27,7 +27,6 @@ disp('Ok');
%
......@@ -41,14 +40,14 @@ disp('operation F_trans = F'' ');
t_trans=zeros(nb_transposition,1);
for i=1:nb_transposition
disp([int2str(i) '/' int2str(nb_transposition)]);
%disp([int2str(i) '/' int2str(nb_transposition)]);
tic
F_trans=F';
t_trans(i)=toc;
end
disp(['time trans ' num2str(mean(t_trans)) ]);
disp(['time trans : ' num2str(mean(t_trans)) ]);
......@@ -64,6 +63,54 @@ disp('Ok');
%% access to coeff
disp('TEST ACCESS ROW OR COL');
F_dense=get_product(F);
t_access_row=zeros(nb_transposition,1);
t_access_col=zeros(nb_transposition,1);
t_access_trans_row=zeros(nb_transposition,1);
t_access_trans_col=zeros(nb_transposition,1);
for i=1:nb_access_coeff
%disp([int2str(i) '/' int2str(nb_access_coeff)]);
tic
col=F(:,1);
t_access_col(i)=toc;
tic
row=F(1,:);
t_access_row(i)=toc;
tic
col_trans=F_trans(:,1);
t_access_trans_col(i)=toc;
tic
row_trans=F_trans(1,:);
t_access_trans_row(i)=toc;
if (col ~=F_dense(:,1))
error('access to the col');
end
if (row ~=F_dense(1,:))
error('access to the row');
end
if (col_trans ~=F_dense(1,:)')
error('access to the col');
end
if (row_trans ~=F_dense(:,1)')
error('access to the row');
end
end
disp(['tps F(1,:) : ' num2str(mean(t_access_row))]);
disp(['tps F(:,1) : ' num2str(mean(t_access_col))]);
disp(['tps F_trans(1,:) : ' num2str(mean(t_access_trans_row))]);
disp(['tps F_trans(:,1) : ' num2str(mean(t_access_trans_col))]);
......@@ -83,7 +130,7 @@ x(:)=1:dim2;
x_trans=zeros(dim1,1);
x_trans(:)=1:dim1;
F_dense=get_product(F);
y_expected = F_dense*x;
y_expected_trans = F_dense'*x_trans;
......@@ -97,7 +144,7 @@ t_trans_mult_fun=zeros(nb_multiplication_vector,1);
for i=1:nb_multiplication_vector
disp([int2str(i) '/' int2str(nb_multiplication_vector)]);
%disp([int2str(i) '/' int2str(nb_multiplication_vector)]);
%% F*x
tic
......@@ -139,7 +186,8 @@ for i=1:nb_multiplication_vector
end
disp(['tps A=A'' ' num2str(mean(t_trans))]);
disp(['tps A=A'' : ' num2str(mean(t_trans))]);
disp(['tps A*x : ' num2str(mean(t_times))]);
disp(['tps A''*x : ' num2str(mean(t_trans_times))]);
disp(['tps mtimes_trans(F,x,''N'') : ' num2str(mean(t_mtimes))]);
......@@ -147,6 +195,28 @@ disp(['tps mtimes_trans(F,x_trans,''T'') : ' num2str(mean(t_mtimes_trans))]);
disp('Ok');
......
......@@ -210,18 +210,72 @@ classdef matlab_faust
slicing_row=S.subs{1};
slicing_col=S.subs{2};
nbcol=size(this,2);
identity=eye(nbcol);
[dim1 dim2]=size(this);
if ischar(slicing_row)
nb_row_selected = dim1;
else
nb_row_selected = length(slicing_row);
end
if ischar(slicing_col)
nb_col_selected = dim2;
else
nb_col_selected = length(slicing_col);
end
% evaluate the complexity of getting the coeff by doing
% A*Identity or A'*Identity
transpose_evaluation = (nb_col_selected > nb_row_selected);
if transpose_evaluation
identity=eye(dim1);
transpose_flag='T';
% switch the 2 different slicing
tmp=slicing_row;
slicing_row=slicing_col;
slicing_col=tmp;
else
identity=eye(dim2);
transpose_flag='N';
end
% selects the column of the identity, if slicing_col is a char, all
% the column are selected
if ~ischar(slicing_col)
identity=identity(:,slicing_col);
identity=identity(:,slicing_col);
end
submatrix=this*identity;
% perform A*identity or A'*identity
submatrix=mtimes_trans(this,identity,transpose_flag);
% selects the row of the submatrix, if slicing_row is a char, all
% the row are selected
if ~ischar(slicing_row)
submatrix=submatrix(slicing_row,:);
submatrix=submatrix(slicing_row,:);
end
% transpose if needed
if transpose_evaluation
submatrix=submatrix';
end
%% former way not optimized to get access to the row
% nbcol=size(this,2);
% identity=eye(nbcol);
%
% if ~ischar(slicing_col)
% identity=identity(:,slicing_col);
% end
%
% submatrix=this*identity;
%
% if ~ischar(slicing_row)
% submatrix=submatrix(slicing_row,:);
% end
end
......@@ -240,3 +294,4 @@ end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment