我正在研究一个兼容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)
}
答案 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)
}