% CUR solution from ChatGPT for images. clear clc A = double(imread('peppers.bmp')); [m n]=size(A); k=150; [U,S,V]=svds(A); row_lev = sum(U.^2,2); col_lev = sum(V.^2,2); row_prob = row_lev / sum(row_lev); col_prob = col_lev / sum(col_lev); row_idx = randsample(m,k,true,row_prob); col_idx = randsample(n,k,true,col_prob); C = A(:, col_idx); R = A(row_idx, :); W = A(row_idx, col_idx); U_cur = pinv(W); A_cur = C * U_cur * R; subplot(1,2,1), imshow(uint8(A)), title('Original') subplot(1,2,2), imshow(uint8(A_cur)), title('CUR approximation') % suppose we want rank 3 approximation % [U,S,V] = svd(A); % k = 50; % U_k = U(:, 1:k); % S_k = S(1:k,1:k); % V_k = V(:,1:k); % % % % [~, row_idx] = maxk(row_lev,k); % [~, col_idx] = maxk(col_lev,k); % % C = A(:, col_idx); % R = A(row_idx, :); % W = A(row_idx, col_idx); % % U_cur = pinv(W); % % A_cur = C * U_cur * R; % % % disp('Original A: '); disp(A); % % disp('CUR approximation: '); disp(round(A_cur)); % % subplot(1,2,1), imshow(A,[]) % subplot(1,2,2), imshow(A_cur,[])