我正在尝试为一些行为心理学研究提出一个评分系统.
我要求人们在图形输入板上画一封信然后追踪它.我想评估这种痕迹的准确性.所以,你绘制任何字母('a'),然后你再做一次,然后我根据它与你第一次绘画时的相似程度得分.附图存储为像素位置.
准确度被评估为与原始信件的接近程度.该方法不需要允许缩放,旋转或位置改变.从概念上讲,它就像两条线之间的区域,只有线条高度不规则,所以积分(据我所知)不会起作用.
我在MATLAB写作,但任何概念上的帮助将不胜感激.我已经尝试将绘制的所有像素之间的最小距离求和,但这给出了良好放置的单点的好(低)分数.
这一定是以前做过的,但我的搜索没有运气.任何帮助非常感谢!
---部分解决方案使用@Bill建议的方法.不起作用,因为bwdist渐变太陡峭.而不是Bill显示的漂亮的第二张图片,它看起来更像是原版.
%% Letter to image
im = zeros(1080,1920,3); % The screen (possible pixel locations)
% A small square a bit like the letter 'a', a couple of pixels wide.
pixthick = 5;
im(450:450+pixthick,[900:1100],:) = 1;
im(550:550+pixthick,[900:1100],:) = 1;
im([450:550],900:900+pixthick,:) = 1;
im([450:570],1100:1100+pixthick,:) = 1;
subplot(2,1,1); imagesc(im); %% atransbw = bwdist(im(:,:,1)<0.5); subplot(2,1,2);
imagesc(atransbw);
Run Code Online (Sandbox Code Playgroud) 我试图找到MATLAB中单元格数组中出现子字符串的位置.下面的代码有效,但相当丑陋.在我看来应该有一个更容易的解决方案.
cellArray = [{'these'} 'are' 'some' 'nicewords' 'and' 'some' 'morewords'];
wordPlaces = cellfun(@length,strfind(cellArray,'words'));
wordPlaces = find(wordPlaces); % Word places is the locations.
cellArray(wordPlaces);
Run Code Online (Sandbox Code Playgroud)
我在 SQLITE 中有一个高分表,它支持三个简单的操作:
SELECT * FROM scores ORDER BY high_score DESC一切正常,但我担心这是如何扩展的:10,000 名用户对高分进行排序需要大约 60 毫秒,这是可以的,但是这个时间大致呈线性上升,因此如果我有 100,000 名用户请求高分将需要大约 600 毫秒,这是太慢了。
有没有一种聪明的方法来插入新用户/更新他们的分数,以避免每次检索排行榜时都必须进行完整排序?例如像 C++ priority_queue 或 python heapq 之类的东西。
我想我可以在每次插入时对整个数据库进行排序和替换(例如对整个 SQLite 表进行排序),但这似乎有点矫枉过正。
我正试图使用花哨的索引尽快从大型numpy数组中获取切片.我很乐意返回一个视图,但高级索引会返回一个副本.
玩具数据:
data = np.random.randn(int(1e6), 50)
keep = np.random.rand(len(data))>0.5
Run Code Online (Sandbox Code Playgroud)
使用默认方法:
%timeit data[keep]
10 loops, best of 3: 86.5 ms per loop
Run Code Online (Sandbox Code Playgroud)
Numpy采取:
%timeit data.take(np.where(keep)[0], axis=0)
%timeit np.take(data, np.where(keep)[0], axis=0)
10 loops, best of 3: 83.1 ms per loop
10 loops, best of 3: 80.4 ms per loop
Run Code Online (Sandbox Code Playgroud)
方法从这里:
rows = np.where(keep)[0]
cols = np.arange(a.shape[1])
%timeit (a.ravel()[(cols + (rows * a.shape[1]).reshape((-1,1))).ravel()]).reshape(rows.size, cols.size)
10 loops, best of 3: 159 ms per loop
Run Code Online (Sandbox Code Playgroud)
如果您正在观看相同大小的视图: …