2016-01-08 37 views
-1

我正在研究與GNU Octave/MATLAB(R)兼容的函數(函數和matlab中的函數都是不完全兼容)。r - GNU Octave - GNU的for循環中的產品和尺寸R中的Octave兼容numel函數

我使用供參考FreeMat numel.m代碼創建將R numel功能,該代碼如下:

function len = numel(x,varargin) 
if (nargin==1) 
    len = prod(size(x)); 
else 
    len = 1; 
    for k=1:length(varargin) 
    len = len * numel(varargin{k}); 
    end 
end 

在numel.m代碼的註釋部分中,提供了這樣的信息:

「一般來說,numel返回prod(size(x)),在X總元件的數量。但是,你可以爲varagin指定多個索引表達式中,如索引1,索引2,...,INDEXM。在這種情況下,輸出的數字是prod(size(x(index1,...,indexm)))。「

我已經能夠在R中實現所有的numel.m代碼,除了for循環。 FreeMat for循環中的表達式是上面引用中最後一條語句的包裝。

如何實現使用pracma size功能這一說法

prod(size(x(index1,...,indexm)) 

中的R?

謝謝。

舉一個例子,一旦numel R代碼裏面是完整,下面應該工作:

library(pracma) 
a <- 1 
b <- ones(2, 3) 
numel(a, b) 
# 6/in both GNU Octave and R 

我包圍下面的numel功能。

library(pracma) 

numel <- function (x, ...) 
{ 

if (nargs() == 1) { 

    lens <- prod(size(x)) 

} else { 

    varargin <- (nargs()-1L) 

    len <- 1 

    lens <- vector("list", Length(varargin)) 

    n <- 1:Length(varargin) 

一旦for循環運行,寫入的代碼無法按預期工作。上面提出的問題被要求修正下面的代碼。

for (k in n) { 

    k <- as.array(k) 

    lens[k] <- len * prod(size(k)) 
# where size is defined in pracma::size 
} 
} 
    lens 
} 

以下是Length函數(基於FreeMat length.m函數和GNU Octave中的其他規範)。在函數中使用長度函數。

Length <- function (x) 
{ 
if (isempty(x)) 

    Length <- 0 

else if (length(is.vector(x)) == 1) 

    Length <- 1 

else if (is.vector(x)) 

    Length <- length(x) 

else (is.matrix(x)) 

    Length <- max(size(x)) 

    return(Length) 
} 

回答

0

下面的代碼工作:

numel <- function (x, ...) 
{ 

if (nargs() == 1) { 

    lens <- prod(size(x)) 

} else { 

    varargin <- list(...) 

    len <- 1 

    lens <- vector("list", Length(varargin)) 

for (k in 1:Length(varargin)) { 

    lens[[k]] <- len * size(varargin[[k]]) 
} 

lens <- prod(unlist(lens)) 

} 
return(lens) 
}