r - GNU Octave - prod& R

时间:2016-01-08 22:19:23

标签: r octave

我正在研究一个兼容GNU Octave / MATLAB(R)的数字函数(pracma和matlab中的数字函数都不完全兼容)。

我使用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指定一些索引表达式,例如index1,index2,...,indexm。在这种情况下,numel的输出为prod(size(x(index1,...,indexm)))。"

我已经能够在R中实现所有的numericl.m代码,但for循环除外。 FreeMat for循环中的表达式是上面引用中最后一个语句的包装。

如何实施此声明

prod(size(x(index1,...,indexm))
在R中使用pracma size函数?

谢谢。

对于一个例子,一旦完成了数字R代码,以下内容应该有效:

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

我附上了以下的数字函数。

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
}

以下是长度函数(基于FreeMat length.m函数和GNU Octave中的其他规范)。 Length函数用于numel函数。

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)
}

1 个答案:

答案 0 :(得分: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)
}