我有一个包含句子字符串的单元格数组x的单元格数组,我希望在x中找到所有唯一字标记的列表,然后使用它为数组结构创建字段名称y如果该字段名称尚不存在因为你 现在我使用double for循环迭代x中的每个句子字符串,然后迭代每个单独的单词来完成任务,但是当单元格数组包含太多字符串时它可能会非常慢.
for i=1:length(x)
unique = unique(x{i});
for j=1:length(unique)
y.(unique{j}) = {};
end
end
Run Code Online (Sandbox Code Playgroud)
样本输入:
x = {{'hello', 'world'}, {'foo', 'bar'}, {'eat', 'foo', 'ice', 'cream'}, {'hello', 'dad'}};
y = {};
Run Code Online (Sandbox Code Playgroud)
那么独特应该是这样的
unique = {'hello', 'world', 'foo', 'bar', 'eat', 'ice', 'cream', 'dad'}
Run Code Online (Sandbox Code Playgroud)
和结构数组y应该具有唯一的字段名称作为字段名称.所以应该有y.hello,y.world,y.foo,y.bar,y.eat,y.ice,y.cream和y.dad.只要根据需要输出长y,就不需要唯一的单词令牌列表.有没有办法通过矢量化或其他方式简化这些操作以使程序运行得更快?谢谢.
R - 当向量在两个矩阵中时,如何矢量化外积和的计算 - X和Y?
示例:
X = cbind(1:3, 2:4)
Y = cbind(0:2, c(0,0,1))
> X
[,1] [,2]
[1,] 1 2
[2,] 2 3
[3,] 3 4
> Y
[,1] [,2]
[1,] 0 0
[2,] 1 0
[3,] 2 1
> outer(X[1,],Y[1,]) + outer(X[2,],Y[2,]) + outer(X[3,],Y[3,])
[,1] [,2]
[1,] 8 3
[2,] 11 4
Run Code Online (Sandbox Code Playgroud)
我想矢量化操作:
outer(X[1,],Y[1,]) + outer(X[2,],Y[2,]) + outer(X[3,],Y[3,])- 可能吗 ?Mayby的一般结构如下:lapply( ,FUN=outer)然后在列表中加入元素的总和?否则我必须循环outer(X[i,],Y[i,]).
我正在尝试使一些代码更有效,并且想知道如何对此进行矢量化:
%==========================================================================
% MinutesInDayTable.m
%
% Creates a table identifying every minute as an integer from 0 to 2400.
minuteTableInDay=zeros(24*60,1);
k=1;
for i=1:24
for j=1:60
minuteTableInDay(k) = ((i-1)*100+(j-1))*100;
k=k+1;
end
end
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ end of code ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud) 给定三个正整数x,y和z,使得x> y.创建以下向量的最有效方法是什么:
1,2,3,..,x-y,x+1,x+2,x+3,..,2x-y,2x+1,2x+2,2x+3,..,3x-y,3x+1,...,..,zx+1,zx+2,zx+3,..,zx-y
Run Code Online (Sandbox Code Playgroud) Data包含label变量和数字x变量,然后我计算x由label(由means对象创建然后我们用作字典)指定的组的平均值,然后我想创建包含重复与label变量对应的平均值的新向量,下面的示例使用for(),I看不出我怎么能把它矢量化,唯一的可能就是使用merge函数,问题是:
是否merge提供了矢量化的好处(我的原始数据集,有几百万的观察结果)?
如果没有,那么是否可以矢量化创建y?
我目前的代码是:
set.seed(123)
data<-data.frame(label=sample(c("A","B"),10,replace=TRUE),x=rnorm(10))
data
# label x
#1 A 1.7150650
#2 B 0.4609162
#3 A -1.2650612
#4 B -0.6868529
#5 B -0.4456620
#6 A 1.2240818
#7 B 0.3598138
#8 B 0.4007715
#9 B 0.1106827
#10 A -0.5558411
means<-aggregate(formula = x~label, data = data, FUN = mean)
means
# label x
#1 A 0.27956110
#2 B 0.03327823 …Run Code Online (Sandbox Code Playgroud) 使用intel编译器,如果用户确认没有使用依赖关系,则仍然可以对循环进行矢量化#pragma ivdep.
我在GCC找到了一个#pragma GCC ivdep,但收到如下错误:
warning: ignoring #pragma GCC ivdep [-Wunknown-pragmas]
#pragma GCC ivdep
在编写某个函数的上下文中,我有以下示例矩阵:
temp =
1 2 0 0 1 0
1 0 0 0 0 0
0 1 0 0 0 1
Run Code Online (Sandbox Code Playgroud)
我想获得一个数组,其中每个元素指示从该列开始的所有非零元素中的元素数.如果列为空,则该元素应对应于下一个非空列.对于矩阵temp,结果将是:
result = [1 3 5 5 5 6]
Run Code Online (Sandbox Code Playgroud)
因为第一个非零元素开始第一列,第三列开始第二列,第五列开始第五列,第六列开始第六列.
如何以矢量化方式对任何通用矩阵(可能包含或不包含空列的矩阵)执行此操作?
我想加速一个简单的积分器,它根据位置和速度描述一组无质量粒子.我不是SSE/AVX专家,但我觉得有趣的是SIMD扩展可以在这里产生什么.
许多论文建议使用数组结构:
struct {
static float2 xy[OUGHTA_BE_ENOUGH];
static float2 vxvy[OUGHTA_BE_ENOUGH];
} Particles;
// in main loop:
Particles.xy[i] += time_delta * Particles.vxvy[i];
Run Code Online (Sandbox Code Playgroud)
但是,对于许多应用来说,相反的方法是有益的:
struct {
float2 xy;
float2 vxvy;
} Particle;
// in main loop:
particles[i].xy += time_delta * particles[i].vxvy;
Run Code Online (Sandbox Code Playgroud)
虽然我模糊地理解要搜索什么来矢量化数组结构版本,但我怀疑有没有办法将SIMD与结构数组版本一起使用,因为字段访问或"调配".
是否有任何技术可以使用SIMD进行上述计算,或者我错过了内在函数?
假设您要从相应的行中减去矩阵的每一行的最大值.你可以使用这样的循环来做到这一点:
# create matrix
mat <- matrix(rnorm(100),ncol=5,nrow=20)
for(i in 1:nrow(mat)){ #for each row
row.max <- max( mat[i,] ) #take the maximum of the row
mat[i,] <- mat[i,] - row.max #subtract it from the row
}
Run Code Online (Sandbox Code Playgroud)
我想到的方式在量化的方式来做到这一点,也许使用max.col(),但是,我不能来的东西为止.有任何想法吗?
谢谢!
编辑:
谢谢你的回答,我接受了(迄今为止)最快的解决方案.
Unit: microseconds
expr min lq mean median uq max neval
loop 4671.687 4906.6820 5124.78995 5019.7965 5214.5935 12318.986 100
apply 41.055 47.0430 60.58208 57.0925 71.6320 158.661 100
rowMaxs 2.139 2.9945 6.21019 5.3465 8.9810 12.402 100
do.call 111.618 125.0890 154.46904 142.4095 …Run Code Online (Sandbox Code Playgroud) 我决定潜入朱莉娅,撞墙。快速。
我正在尝试复制一个简单的操作,该操作在python numpy中如下
a = numpy.array([1,2,3])
b = numpy.array([1,2,3])
a*b
[output]: [1,4,9]
Run Code Online (Sandbox Code Playgroud)
换句话说,“ [1,4,9]”是我期望的输出。
我在Julia中尝试了以下方法:
a = [1,2,3]
b = [1,2,3]
a*b
[output]: MethodError: no method matching *(::Array{Int64,1}, ::Array{Int64,1})
Run Code Online (Sandbox Code Playgroud)
或尝试明智之后:
a = [1,2,3]
b = [1,2,3]'
a*b
[output]: 3×3 Array{Int64,2}:
1 2 3
2 4 6
3 6 9
Run Code Online (Sandbox Code Playgroud)
我知道这似乎是一个基本问题,但我的Google搜寻似乎不是我今天最好的,和/或stackoverflow可以使用此问题和答案;)
感谢您的帮助和指点!
最好