Функция «Sapply» в аналоге R в MATLAB для преобразования кода из R в MATLAB - PullRequest
1 голос
/ 30 сентября 2019

Я хочу преобразовать код в R в MATLAB (не выполнять код R в MATLAB). Код в R выглядит следующим образом:

data_set <- read.csv("lab01_data_set.csv")

# get x and y values
x <- data_set$x
y <- data_set$y

# get number of classes and number of samples
K <- max(y)
N <- length(y)

# calculate sample means
sample_means <- sapply(X = 1:K, FUN = function(c) {mean(x[y == c])})

# calculate sample deviations
sample_deviations <- sapply(X = 1:K, FUN = function(c) {sqrt(mean((x[y == c] - sample_means[c])^2))})

Чтобы реализовать его в MATLAB, я пишу следующее:

%% Reading Data

% read data into memory
X=readmatrix("lab01_data_set(ViaMatlab).csv");

% get x and y values
x_read=X(1,:);
y_read=X(2,:);

% get number of classes and number of samples
K = max(y_read);
N = length(y_read);

% Calculate sample mean - 1st method
% funct1 = @(c) mean(c);
% G1=findgroups(y_read);
% sample_mean=splitapply(funct1,x_read,G1)

% Calculate sample mean - 2nd method
for m=1:3
sample_mean(1,m)=mean(x(y_read == m));
end
sample_mean;

% Calculate sample deviation - 2nd method
for m=1:3
sample_mean=mean(x(y_read == m));
sample_deviation(1,m)=sqrt(mean((x(y_read == m)-sample_mean).^2));
sample_mean1(1,m)=sample_mean;
end
sample_deviation;
sample_mean1;

Как вы видите, я получаю, как вместо этого использовать цикл for в MATLABsapply в R (как 2-й метод в коде), но не знаю, как использовать функцию (возможно splitaplly или любую другую).

PS: не знаю, как загрузить данные,извините за эту часть.

1 Ответ

2 голосов
/ 01 октября 2019

MATLAB, эквивалентный R sapply, равен arrayfun - и его родственникам cellfun, structfun и varfun в зависимости от того, какой тип данных вы вводите.

Например, в R:

> sapply(1:3, function(x) x^2)
[1] 1 4 9

эквивалентно MATLAB:

>>> arrayfun(@(x) x^2, 1:3)

ans =

     1    4    9

Обратите внимание, что если в результате выполнения функции вы передаете arrayfun,cellfun и т. Д. Не имеют идентичного типа или размера для каждого ввода, вам нужно указать 'UniformOutput', 'false'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...